«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.