Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 1
Регистрация: 23.10.2016
Сообщений: 16

Найти индексы повторяющихся символов в матрице

24.10.2016, 10:07. Показов 1972. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача:

Есть матрица,

допустим:

1 1 1 3 4
2 1 3 1 2
2 2 3 4 1
3 3 3 1 4

Необходимо найти индексы одинаковых чисел. Допустим "1".

И вывести на консоль в таком виде:

Line 1: [0-2]
Line 2: [1,3]
Line 3: [4]
Line 4: [3]

Синтаксис должен соответствовать, т.е. должны быть квадратные скобки и тире, если индексы идут подряд.

Вывести индексы выходит. С помощью двух циклов. Проблема с тире.

Возможно ли добиться результата с помощью регулярных выражений? Допустим replaceAll?

Заранее сенкс.

Добавлено через 23 часа 53 минуты
Наведите хоть на мысль.

Добавлено через 20 секунд
Наведите хоть на мысль.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.10.2016, 10:07
Ответы с готовыми решениями:

Указать индексы повторяющихся символов
Сдвиг сделан, дубликаты удалены, а как найти индексы не могу понять... В примере использовал 10 вместо 100 чтоб проще было проверять...

В одномерном массиве символов найти количество повторяющихся последовательностей символов
В одномерном массиве символов найти количество повторяющихся последовательностей символов с длиной больше или равной двум. Например, в...

В одномерном массиве символов найти количество повторяющихся последовательностей символов
Добрый вечер! Есть такая программа:В одномерном массиве символов найти количество повторяющихся последовательностей символов с длиной...

13
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
24.10.2016, 11:22
а если, например, 11232, то что надо вывести?

Добавлено через 10 минут
а, понятно, заводишь две переменные, begin, end. Перебираешь символы в строке, если символ меняется, begin=end=index, если не меняется, end=index. Таким образом получишь начало и конец каждого диапазона. дальше, если begin==end, выводишь begin, иначе, выводишь begin-end.
1
0 / 0 / 1
Регистрация: 23.10.2016
Сообщений: 16
24.10.2016, 14:30  [ТС]
Проблема вывести повторяющиеся индексы через тире: первый -последний
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
24.10.2016, 16:43
System.out.println(begin+"-"+end);
0
0 / 0 / 1
Регистрация: 23.10.2016
Сообщений: 16
24.10.2016, 17:58  [ТС]
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int begin = 0;
        int end = 0;
        int[][] arrayFindOne =
                {{1, 1, 1, 3, 4},
                        {2, 1, 3, 1, 2},
                        {2, 2, 3, 4, 1},
                        {3, 3, 3, 1, 4}
                };
        for (int i = 0; i < 4; i++) {
            System.out.print("Line:" + (i + 1) + "[");
 
            for (int j = 0; j < 5; j++) {
 
                if (arrayFindOne[i][j] == 1) {
                    begin = j;
                }
                end = j;
                if (begin == end) {
                    System.out.print(begin + ",");
 System.out.print(begin + "-" + end);
            }
                System.out.print("]");
                System.out.println();
Не выходит....
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
24.10.2016, 18:47
11213
Встретили 1, begin=0, end=0, следующий символ тоже 1, end++, следующий символ не 1, записали begin(0)-end(1), следующий символ 1, begin=3, end=3, следующий не 1, begin==end, записали begin, следующий символ не один, конец строки.
На выходе 0-1,3
А у тебя как-то совсем не так написано.
0
0 / 0 / 1
Регистрация: 23.10.2016
Сообщений: 16
24.10.2016, 19:25  [ТС]
Спасибо. Псевдокод понятен.

Программа работала, но без тире при повторее. Попытался регулярками,но не получилось.

Во втором цикле это как все ифами оформить?
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
25.10.2016, 10:49
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Main {
    public static void main(String[] args) {
        int[][] m = {
                {1, 1, 1, 3, 4},
                {2, 1, 3, 1, 2},
                {2, 2, 3, 4, 1},
                {3, 3, 3, 1, 4}
        };
 
        int item = 1;
 
        MatrixAnalyzer analyzer = new MatrixAnalyzer(m, item);
 
        System.out.println(analyzer);
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class MatrixAnalyzer {
    private ArrayList<RowData> rowData;
 
    public MatrixAnalyzer(int[][] matrix, int value) {
        rowData = new ArrayList<>();
 
        int rowIndex = 0;
        for (int[] row : matrix) {
            RowData temp = new RowData(row, rowIndex, value);
 
            if (!temp.isEmpty())
                rowData.add(temp);
 
            rowIndex++;
        }
    }
 
    @Override
    public String toString() {
        String result = "";
 
        if (rowData.isEmpty())
            result = "Element not found in matrix";
        else {
            for (int i = 0; i < rowData.size(); i++) {
                result = result + rowData.get(i) + "\n";
            }
        }
 
        return result;
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class RowData {
    private int rowIndex;
 
    private ArrayList<Occurrence> occurrences;
 
    public RowData(int[] row, int rowIndex, int value) {
        occurrences = new ArrayList<>();
 
        this.rowIndex = rowIndex;
 
        int start = Occurrence.INDEX_UNSET;
        int end = Occurrence.INDEX_UNSET;
 
        for (int i = 0; i < row.length; i++) {
            if (row[i] == value) {
                if (start == Occurrence.INDEX_UNSET)
                    start = i;
                if (i == row.length - 1)
                    end = i;
            } else {
                if (start != Occurrence.INDEX_UNSET)
                    end = i - 1;
            }
 
            if ((start != Occurrence.INDEX_UNSET) && (end != Occurrence.INDEX_UNSET)) {
                occurrences.add(new Occurrence(start, end));
                start = Occurrence.INDEX_UNSET;
                end = Occurrence.INDEX_UNSET;
            }
 
        }
    }
 
    public boolean isEmpty() {
        return occurrences.isEmpty();
    }
 
    @Override
    public String toString() {
        return "Line " + rowIndex + ": " + occurrences;
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Occurrence {
    public static final int INDEX_UNSET = -1;
 
    private int start;
    private int end;
 
    public Occurrence(int start, int end) {
        this.start = start;
        this.end = end;
    }
 
    @Override
    public String toString() {
        if (start == end)
            return Integer.toString(start);
        else
            return Integer.toString(start) + "-" + Integer.toString(end);
    }
}
1
502 / 348 / 134
Регистрация: 14.06.2016
Сообщений: 669
25.10.2016, 12:33
Ну и плюс регулярки
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static void main(String[] args){
        int[][] arrayFindOne = {{1, 1, 1, 3, 4},
                                {2, 1, 3, 1, 2},
                                {2, 2, 3, 4, 1},
                                {3, 3, 3, 1, 4}};
        int i = 0;
        for (int[] array : arrayFindOne){
            String res = "";
            Matcher mtch = Pattern.compile("1+").matcher(Arrays.stream(array)
                                                              .mapToObj(String::valueOf)
                                                              .reduce("", (k, j) -> k.concat(j)));
            while(mtch.find()) 
                res += (res.equals("") ? "" : ",") + mtch.start() + ((mtch.group().length() == 1) ? "" : "-" + (mtch.end() - 1));
            System.out.printf("Line %d: [%s]%n", ++i, res);
        }
    }
Bash
1
2
3
4
Line 1: [0-2]
Line 2: [1,3]
Line 3: [4]
Line 4: [3]
3
0 / 0 / 1
Регистрация: 23.10.2016
Сообщений: 16
25.10.2016, 13:46  [ТС]
У меня JDK 1.7 не компилирует. Нужна 1.8?

Есть ли варианты просто пройтись по массиву циклами с иф-ами и сконкатенировать результат?
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
25.10.2016, 14:03
Алекс_79, да, там лямбда из 8й джавы в 11й строке.

Добавлено через 2 минуты
Цитата Сообщение от Алекс_79 Посмотреть сообщение
Есть ли варианты просто пройтись по массиву циклами с иф-ами и сконкатенировать результат?
Так в моем примере почти так и сделано, только что на классы раздроблено. Возмите базу из RowData и готовьте отдельные куски на конкатенацию.
0
0 / 0 / 1
Регистрация: 23.10.2016
Сообщений: 16
25.10.2016, 17:22  [ТС]
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public static void main(String[] args) {
 
        int begin = 0;
        int end = 0;
        int[][] arrayFindOne =
                {{1, 1, 1, 3, 4},
                        {2, 1, 3, 1, 2},
                        {2, 2, 3, 4, 1},
                        {3, 3, 3, 1, 4}
                };
        for (int i = 0; i < 4; i++) {
            System.out.print("Line:" + (i + 1) + "[");
 
            for (int j = 0; j < 5; j++) {
 
                if (arrayFindOne[i][j] == 1) {
                    if (begin == j) {
                        begin = j;
                        if (j == 1)
                            end = j;
                    } else {
                        if (begin != 1)
                            end = j - 1;
                        System.out.print(begin + ",");
                    }
if ((begin != j) && (end != j)) {
                        begin=j;
                        end=j;
 
                        System.out.print(begin + "-" + end);
                    }
                }
                System.out.print("]");
                System.out.println();
            }
        }
    }
}
Фигня выходит. Запутался я с этими иф-ами.
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
25.10.2016, 19:17
на бумажке руками сделай все от начала до конца для одной строки.
0
502 / 348 / 134
Регистрация: 14.06.2016
Сообщений: 669
27.10.2016, 06:05
Поменяй тогда строчку на
Java
1
Matcher mtch = Pattern.compile("1+").matcher(Arrays.toString(array).replaceAll("\\D", ""));
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.10.2016, 06:05
Помогаю со студенческими работами здесь

В одномерном массиве символов найти количество повторяющихся последовательностей символов
В одномерном массиве символов найти количество повторяющихся последовательностей символов с длиной больше или равной двум. Например, в...

В матрице найти сумму повторяющихся элементов главной диагонали
Не могу понять как решить задачу! В матрице А найти сумму повторяющихся элементов главной диагонали; если она (полученная сумма) делится...

В матрице найти индексы отрицательных элементов
задали такую задачу: В матрице В(6,8) найти индексы отрицательных элементов, поменять местами 2-й и 4-й столбцы вот что у меня...

В матрице найти индексы отрицательных элементов
Найти в двумерном массиве целых чисел размером 3х4 номера отрицательных элементов (вывести их на экран), если таких нет, то сообщить об...

Найти индексы двух одинаковых элементов в матрице
Дана целочисленная матрица размера n X m, в которой имеются ровно два одинаковых элемента. Найти индексы этих элементов.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru