Как создать двумерный массив на java и заполнить его единицами по краям?
Как создать двумерный массив на java и заполнить его единицами по краям, например для размера 4х4 он должен быть заполнен согласно таблице:
{1,1,1,1}
{1,0,0,1}
{1,0,0,1}
{1,1,1,1}
Я пробовал несколько вариантов, но как в таблице не получается один из вариантов
int[][] arr = new int[SIZE][SIZE];
for (int i = 0; i < SIZE-1; i++) {
arr[i][i] = 1;
arr[i][SIZE-3] = 1;
arr[i][SIZE-2]=1;
arr[i+1][SIZE-3]=0;
arr[i+1][SIZE-2]=0;
}
printArr(arr);
public static void printArr(int[][] arr) {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
Ответы (3 шт):
public class Main {
public static void main(String[] args) {
int SIZE = 4;
int[][] arr = new int[SIZE][SIZE];
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (i == 0 || i == SIZE-1 || j == 0 || j == SIZE-1) {
arr[i][j] = 1;
} else {
arr[i][j] = 0;
}
}
}
printArr(arr);
}
public static void printArr(int[][] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
}
вывод:
1 1 1 1
1 0 0 1
1 0 0 1
1 1 1 1
Один из вариантов решения твоей задачи. В некоторых местах сократить код, но так он станет менее читаемым.
public class Main {
private static final int SIZE = 4;
public static void main(String[] args) {
int[][] arr = new int[SIZE][SIZE]; // Создаем двумерный массив
// Индексирование: [строка][столбец]
for (int j = 0; j < SIZE; j++) // Заполняем первую строку единицами
arr[0][j] = 1;
for (int j = 0; j < SIZE; j++) // Заполняем последнюю строку единицами
arr[SIZE - 1][j] = 1;
for (int i = 1; i < SIZE - 1; i++) // Заполняем первый столбец (кроме первой и последней строки)
arr[i][0] = 1;
for (int i = 1; i < SIZE - 1; i++) // Заполняем последний столбец (кроме первой и последней строки)
arr[i][SIZE - 1] = 1;
printArr(arr);
}
public static void printArr(int[][] arr) { // Метод, выводящий массив
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++)
System.out.print(arr[i][j] + " ");
System.out.println();
}
}
}
Для заполнения "по краям" двумерного квадратного массива достаточно использовать индексы правильно.
Также лучше вынести создание массива в отдельный метод.
В простейшем случае реализация может выглядеть так:
public static int[][] createSquareMatrix(int size) {
int[][] arr = new int[size][size]; // квадратный массив заполнен нулями
int last = size - 1;
for (int i = 0; i < size; i++) {
arr[0][i] = arr[last][i] = arr[i][0] = arr[i][last] = 1;
}
return arr;
}
В такой реализации количество присваиваний составит 4 * N
(16 для N = 4
), тогда как "длина" контура равна 2 * N + 2 * (N - 2) = 4 * (N - 1)
, т.е. 12 для N = 4
, то есть возникают 4 лишних "переприсваивания" в угловых позициях матрицы.
Этого можно избежать, если сначала записать нужные значения в углы, а затем в цикле присвоить оставшиеся элементы по краям:
public static int[][] createSquareMatrix1(int size) {
int[][] arr = new int[size][size]; // квадратный массив заполнен нулями
int last = size - 1;
// заполним угловые позиции, 4 присваивания
arr[0][0] = arr[0][last] = arr[last][0] = arr[last][last] = 1;
// 4 * (size - 2) = 4 * size - 8 присваиваний в цикле
for (int i = 1; i < last; i++) {
arr[0][i] = arr[last][i] = arr[i][0] = arr[i][last] = 1;
}
return arr;
}
Ещё один вариант без лишних присваиваний предложен в комментариях @MBo, здесь будет использоваться один цикл с количеством итераций N - 1
, в каждой итерации 4 присваивания:
public static int[][] createSquareMatrixMbo(int size) {
int[][] arr = new int[size][size];
for (int i = 0, last = size - 1, j = last; i < last; i++, j--) {
arr[0][i] = arr[last][j] = arr[j][0] = arr[j - 1][last] = 1;
}
return arr;
}
Возможна и более быстрая реализация, например, если в одной итерации заполнять элементы в начале и в конце строки / столбца, то есть, за одну итерацию можно устанавливать значения сразу 8 элементов:
public static int[][] createSquareMatrixFast(int size) {
int[][] arr = new int[size][size];
int last = size - 1;
// заполняем углы, 4 присваивания
arr[0][0] = arr[0][last] = arr[last][0] = arr[last][last] = 1;
// заполняем центры сторон для нечётного размера матрицы, ещё 4
if ((size & 1) == 1) {
int half = size / 2;
arr[0][half] = arr[last][half] = arr[half][0] = arr[half][last] = 1;
}
// количество итераций в цикле (N - 2)/2, в каждой 8 присваиваний
for (int i = 1, j = last - 1; i < j; i++, j--) {
arr[0][i] = arr[0][j] = arr[last][i] = arr[last][j] = // горизонтали
arr[i][0] = arr[j][0] = arr[i][last] = arr[j][last] = 1; // вертикали
}
return arr;
}
В таком случае "граница" в матрице 4х4 будет заполнена за одну итерацию.