Как перебрать массив 2d по диагонали сверху слева направо снизу

Я пытаюсь выполнить итерацию квадратного массива 2d для всех диагоналей сверху слева направо снизу. У меня есть код для итерации снизу слева вверх справа, но мне нужно адаптировать его, чтобы он также итерировался в другую сторону.

public static void main(String[] args) {
       int[][] a = {
                {1,   2,  3,  4},
                {0,   1,  2,  3},
                {-1,  0,  1,  2},
                {-2, -1,  0,  1},
        };
        for (int j = 0; j <= a.length + a.length - 2; j++) {
            for (int k = 0; k <= j; k++) { // cols
                int l = j - k; //  rows
                if (l < a.length && k < a.length) {
                    System.out.print(a[l][k] + " ");
                }
            }
            System.out.println();
        }
}

Результаты:

1 
0 2 
-1 1 3 
-2 0 2 4 
-1 1 3 
0 2 
1 

Это диагонали от левого нижнего до правого верхнего. Как я могу адаптировать метод для печати диагоналей другим способом, чтобы получить следующие результаты:

-2
-1 -1
0 0 0
1 1 1 1
2 2 2 
3 3
4

Спасибо за вашу помощь.


person Rpp    schedule 16.02.2019    source источник
comment
как int l = a.length-1; ?   -  person Rpp    schedule 16.02.2019
comment
перешел к правильному ответу с обновленным кодом. И нет, так как L = a.lenght - L, еще один пример того, что однобуквенная переменная плоха :)   -  person Wisthler    schedule 16.02.2019


Ответы (1)


Просто нужно отразить адрес строки

public static void main(String[] args) {
       int[][] a = {
                {1,   2,  3,  4},
                {0,   1,  2,  3},
                {-1,  0,  1,  2},
                {-2, -1,  0,  1},
        };
        for (int j = 0; j <= a.length + a.length - 2; j++) {
            for (int k = 0; k <= j; k++) { // cols
                int l = j - k; //  rows
                int mirror = a.lenght - l;
                if (mirror >= 0 && mirror < a.length && k < a.length) {
                    System.out.print(a[mirror][k] + " ");
                }
            }
            System.out.println();
        }
}
person Wisthler    schedule 16.02.2019