Диагональные элементы двухмерного массива
Дано задание создать квадратный двумерный массив и заполнить его диагональные элементы единицами при помощи цикла. Я выполнила задание следующим образом:
public class lesson2dz4 {
public static void main(String[] args) {
int[][] arr = new int[3][3];
for (int i = 0; i < arr.length; i++) {
for (int j = 0, x = arr[i].length; j < arr[i].length; j++, x--) {
if (i == j || i == x - 1) arr[i][j] = 1;
System.out.print(arr[i][j] + " ");
}
System.out.print("\n");
}
}
}
Но до - 1 в условии дошла методом проб и ошибок, так что логически не понимаю, откуда он берется. Если рассуждать человеческим, а не программерским языком переменная i отвечает за строки массива, переменная j - за столбцы, но если ограничиться ими двумя, то единицы вводятся только по диагонали слева направо. Чтобы получить и справа налево, введена переменная x, которая идет по столбцам в обратную сторону. Почему из нее нужно вычитать единицу? Объясните, пожалуйста!
Ответы (3 шт):
Все дело в начальном значении. Массив из 3 элементов индексируется 0,1,2 но размер у него 3. У Вас x изначально:
x = arr[i].length; //здесь 3
Поэтому Вам на каждом повторе цикла приходится вычитать единицу. Все, что нужно - вычесть единицу при изначальной инициализации:
x = arr[i].length - 1;
Заметьте, что у Вас для i, j стоит знак строго меньше <.
Итого наиболее правильный вариант:
public class lesson2dz4 {
public static void main(String[] args) {
int[][] arr = new int[3][3];
for (int i = 0; i < arr.length; i++) {
for (int j = 0, x = arr[i].length - 1; j < arr[i].length; j++, x--) {
if (i == j || i == x) arr[i][j] = 1;
else arr[i][j] = 0;
System.out.print(arr[i][j] + " ");
}
System.out.print("\n");
}
}
}
Если задача только заполнить (без вывода):
public class lesson2dz4 {
public static void main(String[] args) {
int[][] arr = new int[3][3];
for (int i = 0; i < arr.length; i++)
arr[i][i] = 1;
arr[arr.length - 1 - i][i] = 1;
}
}
arr.length - возвращает количество элементов в массиве, т. е. в моем случае 5, но нумерация элементов начинается с 0, т. е. [0,1,2,3,4] - последний элемент - 4. Если попытаться получить элемент arr[5], то получим ошибку ArrayIndexOutOfBoundsException - индекс за пределами массива. Код я бы на стримах переписал:
int dimension = 5;
int[][] arr = new int[dimension][dimension];
IntStream.range(0, dimension).forEach(i -> {
arr[i][i] = 1;
arr[i][arr.length - 1 - i] = 1;
});
Arrays.stream(arr).map(Arrays::toString).forEach(System.out::println);
// [1, 0, 0, 0, 1]
// [0, 1, 0, 1, 0]
// [0, 0, 1, 0, 0]
// [0, 1, 0, 1, 0]
// [1, 0, 0, 0, 1]
Правильный алгоритм с учетом вышеизложенного. Все алгоритмы, что сверху, кроме кода на стриме, выводят неверно/некорректно. Путем проб и ошибок единственно верный на Foreach.
package clearsky;
import java.util.Arrays;
public class homework2n4 {
public static void main(String[] args) {
int n = 4;
int [][] arr= new int [n][n];
for (int i =0; i< arr.length; i++){
for (int j=0; j<arr.length; n= arr[i].length, j++, n--){
if (i==j|| i==n-j ){
arr[i][j]=1;
System.out.println("на позиции i номер " + i + " и на позиции j номер " + j + " число" + arr[i][j]);}
else {
arr[i][j]=0;
}
}}}}