1. Обзор
В этом уроке мы увидим, как перебирать двумерный массив по диагонали. Предлагаемое нами решение можно использовать для квадратного двумерного массива любого размера.
2. Двумерный массив
Ключом к работе с элементами массива является знание того, как получить определенный элемент из этого массива. Для двумерного массива мы используем индексы строк и столбцов для получения элементов массива. Для этой задачи мы будем использовать следующую диаграмму, чтобы показать, как получить эти элементы.
Далее нам нужно понять, сколько диагональных линий у нас есть в нашем массиве, как показано на диаграмме. Мы делаем это, сначала получая длину одного измерения массива, а затем используя его для получения количества диагональных линий ( diagonLines
) .
Затем мы используем количество диагональных линий, чтобы получить среднюю точку, которая поможет в поиске индексов строк и столбцов.
В этом примере средняя точка равна трем:
int length = twoDArray.length
int diagonalLines = (length + length) - 1
int midPoint = (diagonalLines / 2) + 1
3. Получение индексов строк и столбцов
Чтобы перебрать весь массив, мы начинаем цикл с 1 до тех пор, пока переменная цикла не станет меньше или равна переменной диагональных
линий.
for (int i = 1; i <= diagonalLines; i++) {
// some operations
}
Давайте также представим идею количества элементов в диагональной линии, назвав ее itemsInDiagonal
. Например, в строке 3 на диаграмме выше есть 3 элемента (g, e, c), а в строке 4 — 2 (h, f). Эта переменная увеличивается на 1 в цикле, когда переменная цикла i
меньше или равна midPoint
. В противном случае он уменьшается на 1.
После увеличения или уменьшения itemsInDiagonal
у нас появляется новый цикл с переменной цикла j
. Переменная j
увеличивается с 0 до тех пор, пока она не станет меньше, чем itemsInDiagonal.
Затем мы используем переменные цикла i
и j
для получения индексов строк и столбцов. Логика этого вычисления зависит от того, больше ли переменная цикла i
, чем midPoint,
или нет. Когда i
больше, чем midPoint
, мы также используем переменную длины
для определения индексов строки и столбца:
int rowIndex;
int columnIndex;
if (i <= midPoint) {
itemsInDiagonal++;
for (int j = 0; j < itemsInDiagonal; j++) {
rowIndex = (i - j) - 1;
columnIndex = j;
items.append(twoDArray[rowIndex][columnIndex]);
}
} else {
itemsInDiagonal--;
for (int j = 0; j < itemsInDiagonal; j++) {
rowIndex = (length - 1) - j;
columnIndex = (i - length) + j;
items.append(twoDArray[rowIndex][columnIndex]);
}
}
4. Вывод
В этом руководстве мы показали, как перебирать квадратный двумерный массив по диагонали, используя метод, который помогает получить индексы строк и столбцов.
Как всегда, полный исходный код примера доступен на GitHub .