Найти все одинаковые элементы в двумерном массиве

Есть метод, который должен проверять, содержится ли число в двумерном массиве(по умолчанию имеющего k строк и m столбцов, начианащегося с 1 и линейно заполненного: 1, 2 , 3 ..., k*m). Если да, то метод выводит его индекс, в остальном [-1,-1]. Теперь добавляется метод, который должен создавать двумерный массив с рандомными числами от low до high(задаются при вызове функции создания рандомного массива). Задача все та же, нужно найти все элменты и если их несколько, то вывести их в массиве,однако мой код перестает искать, после того, как находит первое соответствие ( я понимаю почему он так делает, мне нужен совет, как сделать так, чтобы в случае, если чисел несколько, то они выводились не как один массив, а в несколько строчек, а в лучшем случае по форме: [x,y], [z,a],...).
P.S. переменная pass проверяет методом бинарного поиска(который содержит функция find), содержится ли число в массиве.


Ответы (1 шт):

Автор решения: Nowhere Man

Реализация метода, который возвращает индексы всех элементов, равных заданному, в двумерном массиве (зубчатом) при помощи Stream API:

public static int[][] search2D(int[][] haystack, int needle) {
    return IntStream.range(0, haystack.length)                // индексы строк
        .mapToObj(i -> IntStream.range(0, haystack[i].length) // индексы колонок
            .filter(j -> haystack[i][j] == needle) // поиск элементов
            .mapToObj(j -> new int[]{i, j})        // создать массив для пары индексов
        ) // Stream<Stream<int[]>>
        .flatMap(s -> s) // Stream<int[]>
        .toArray(int[][]::new);            // получить 2D массив индексов
}

Тест:

int[][] arr = {
  {1, 2, 3, 4},
  {6, 8, 4, 2, 0, 2},
  {2, 0, 2, 1, 2}
};

System.out.println(Arrays.deepToString(search2D(arr, 2)));

Результат:

[[0, 1], [1, 3], [1, 5], [2, 0], [2, 2], [2, 4]]
→ Ссылка