«1. Обзор
В этом уроке мы увидим, как перебирать двумерный массив по диагонали. Предлагаемое нами решение можно использовать для квадратного двумерного массива любого размера.
2. Двумерный массив
Ключом к работе с элементами массива является знание того, как получить определенный элемент из этого массива. Для двумерного массива мы используем индексы строк и столбцов для получения элементов массива. Для этой задачи мы будем использовать следующую диаграмму, чтобы показать, как получить эти элементы.
Далее нам нужно понять, сколько диагональных линий у нас есть в нашем массиве, как показано на диаграмме. Мы делаем это, сначала получая длину одного измерения массива, а затем используя его для получения количества диагональных линий (diagonalLines).
Затем мы используем количество диагональных линий, чтобы получить среднюю точку, которая поможет в поиске индексов строк и столбцов.
В этом примере средняя точка равна трем:
3. Получение индексов строк и столбцов
int length = twoDArray.length
int diagonalLines = (length + length) - 1
int midPoint = (diagonalLines / 2) + 1
Чтобы перебрать весь массив, мы начинаем цикл с 1 до тех пор, пока переменная цикла не станет меньше или равный переменной диагональных линий.
Давайте также введем понятие количества элементов в диагональной линии, назвав его itemsInDiagonal. Например, в строке 3 на диаграмме выше есть 3 элемента (g, e, c), а в строке 4 — 2 (h, f). Эта переменная увеличивается на 1 в цикле, когда переменная цикла i меньше или равна midPoint. В противном случае он уменьшается на 1.
for (int i = 1; i <= diagonalLines; i++) {
// some operations
}
После увеличения или уменьшения itemsInDiagonal у нас появляется новый цикл с переменной цикла j. Переменная j увеличивается с 0 до тех пор, пока она не станет меньше, чем itemsInDiagonal.
Затем мы используем переменные цикла i и j для получения индексов строк и столбцов. Логика этого вычисления зависит от того, больше ли переменная цикла i, чем midPoint, или нет. Когда i больше, чем midPoint, мы также используем переменную длины для определения индексов строк и столбцов: массив с помощью метода, помогающего получить индексы строк и столбцов.
Как всегда, полный исходный код примера доступен на GitHub.
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]);
}
}
«
In this tutorial, we have shown how to loop diagonally through a square two-dimensional array using a method that helps in getting row and column indices.
As always, the full source code of the example is available over on GitHub.