Можно ли перебрать двумерный массив без двух циклов для? - PullRequest
0 голосов
/ 27 мая 2018

Например, если у меня есть:

int Myarray[][] = new int[][] {{1,2}, {3,4}};
for (int line=0; line < Myarray.length; line++) {
    for (int column = 0; column < Myarray[0].length; column++) {
        // do something ...
    }
}

Как я могу пройти весь массив без двух циклов?

Ответы [ 3 ]

0 голосов
/ 27 мая 2018

Вы можете выполнить итерацию без каких-либо циклов:

void recursive(int[][] array, int r, int c) {
  if (r >= array.length) return;
  if (c >= array[r].length) {
    recursive(array, r+1, 0);
  } else {
    System.out.println(array[r][c]);
    recursive(array, r, c+1);
  }
}

Затем вызовите с помощью recursive(array, 0, 0), чтобы начать.

Но в этом нет практической выгоды.Это будет работать плохо из-за всех дополнительных усилий, связанных с вызовом метода, по сравнению с простым увеличением int.(Кроме того, в зависимости от размера массива вы можете получить переполнение стека).

0 голосов
/ 27 мая 2018

Если вам не нужно знать строку или столбец в коде «сделать что-то» (не указано в вопросе), вы можете:

Arrays.stream(Myarray).flatMap(Arrays:stream)
    .forEach(n -> /* do something with “n”, the cell value */);
0 голосов
/ 27 мая 2018

Ну, вы можете использовать только один цикл:

for (int i = 0; i < Myarray.length*Myarray.length; i++) {
    int row = i / Myarray.length;
    int col = i % Myarray.length;
    System.out.println(Myarray[row][col]);
}

Но это предполагает, что ваш 2D-массив квадратный, то есть его ширина и длина везде одинаковы.Еще один способ сказать, что двумерный массив не является неровным.

Демонстрация

Примечание.заставить вещи работать быстрее.Если вам нужно дотронуться до каждого элемента в вашем массиве, мой предложенный код и ваш текущий двойной цикл в основном имеют одинаковую сложность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...