Как создать двумерный массив на 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 шт):

Автор решения: Awerty11111
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
→ Ссылка
Автор решения: Sergey

Один из вариантов решения твоей задачи. В некоторых местах сократить код, но так он станет менее читаемым.

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();
        }
    }
}
→ Ссылка
Автор решения: Nowhere Man

Для заполнения "по краям" двумерного квадратного массива достаточно использовать индексы правильно.

Также лучше вынести создание массива в отдельный метод.

В простейшем случае реализация может выглядеть так:

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 будет заполнена за одну итерацию.

→ Ссылка