Получение списка массивов путем диагонального обхода двумерного массива с левыми диагональными сечениями? - PullRequest
0 голосов
/ 16 февраля 2019

Я знаю, что могу просто использовать for (int i = 0; i < myArray.length; i++) или расширенный цикл for для полной итерации цикла.

Однако я пытаюсь создать новые массивы char [] путем полной итерации по диагонали через прямоугольник2D массив, в то же время принимая левые участки (вместо ваших обычных правых участков).

Другими словами , посмотрите на изображение ниже.Мне бы хотелось, чтобы каждый массив char [] состоял из всех символов между двумя красными диагональными линиями на изображении ниже.

enter image description here

Таким образом, если итерация начинается в верхнем правом углу, первый созданный массив будет ['q'], а второй будет ['e', 'w'], третий, ['d', 'j', 'e'] и т. Д.

Вот код диаграммы:

private static char[][] bigArray = {
        {'a', 'b', 'c', 'd', 'e', 'q'},
        {'f', 'g', 'h', 'i', 'j', 'w'},
        {'k', 'l', 'm', 'n', 'o', 'e'},
        {'p', 'q', 'r', 's', 't', 'r'},
        {'u', 'v', 'w', 'x', 'z', 't'}};

Попытка выполнить итерацию по диагонали слева направо затрудняет всегдазнать длину массива, который я использую.Тем более что новые массивы char [], которые я создаю, будут иметь разную длину.

Есть ли способ, с помощью которого я могу сказать java прекратить итерации на определенной длине для каждого создаваемого мной массива?

1 Ответ

0 голосов
/ 16 февраля 2019

Попытка перебрать диагонали, расположенные слева, затрудняет всегда знать длину используемого массива.Тем более что новые массивы char [], которые я создаю, будут иметь разную длину.

To рассчитайте длину диагонали (размер вашего нового char[]) на основе вашего текущегоположение в матрице bigArray (с индексами i и j) для этого

int newCharArrayLength = Math.min(height - i, width - j);

Реализация (пояснение ниже)

private static List<char[]> getDiagonalsList(char[][] arr) {
    List<char[]> ans = new ArrayList<>();
    int height = arr.length;
    int width = arr[0].length;
    int numberOfDiagonals = arr.length + arr[0].length - 1;

    for (int diagonalIdx = 0; diagonalIdx < numberOfDiagonals; diagonalIdx++) {
        int i = Math.max(diagonalIdx - width + 1, 0);
        int j = Math.max(width - diagonalIdx - 1, 0);
        int currentDiagonalLength = Math.min(height - i, width - j);
        int idx = 0;

        char[] charArr = new char[currentDiagonalLength];
        while (i < height && j < width)
            charArr[idx++] = arr[i++][j++];

        ans.add(charArr);
    }

    return ans;
}

A main функция

Вы можете написать main функцию, подобную этой, чтобы вывести ваш результат

public static void main(String[] args) {
    char[][] arr = {
            {'a', 'b', 'c', 'd', 'e', 'q'},
            {'f', 'g', 'h', 'i', 'j', 'w'},
            {'k', 'l', 'm', 'n', 'o', 'e'},
            {'p', 'q', 'r', 's', 't', 'r'},
            {'u', 'v', 'w', 'x', 'z', 't'}};

    for (char[] diag : diagonal(arr))
        System.out.println(diag);
}

Вывод

Результат будет выглядеть так

q
ew
dje
cior
bhntt
agmsz
flrx
kqw
pv
u

Пояснениеи Алгоритм

  1. Инициализация List из char[].Здесь вы будете размещать свои диагонали на каждой итерации
  2. Рассчитайте общую сумму numberOfDiagonals для вашего прямоугольника.Вы можете сделать это, суммируя ширину и высоту минус один (повторный угол)
  3. Рассчитайте ваш i индекс.Это может быть сделано путем вычитания ширины вашего прямоугольника из диагонального индекса минус один (потому что мы начинаем индексирование с 0).Этот индекс всегда должен быть положительным
  4. Рассчитайте свой j индекс.Тот же принцип, что и раньше, но вы вычитаете обратное вычитание, поскольку нам нужна обратная диагональ.Это также должно быть положительным
  5. Рассчитать ваш currentDiagonalLength.Для этого на меньше расстояние между текущей строкой (i) и высотой ИЛИ текущей колонкой (j) и шириной
  6. Инициализировать массив, который будет содержать вашу диагональ с ранее вычисленной длиной
  7. Добавить элементы один за другим.На каждой итерации увеличивайте текущую строку i и текущий столбец j
  8. Добавляйте этот массив в список, упомянутый в шаг 1
  9. Повтор шаг 3 до шаг 8 , пока вы не выполните все диагонали
...