Java ArrayList - 8x8 игровая доска - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь представить доску 8x8 через список ArrayLists с использованием коллекций. Когда я запускаю это, операторы печати показывают, что вызываются правильные координаты.

static List<ArrayList<Integer>> BOARD = new ArrayList<>();

static {
    for (int i = 0; i < 8; i++) {
       for (int j = 0; j < 8; j++) {
            BOARD.add(i, new ArrayList<>());
            System.out.println("i "+i + " j "+j);
            BOARD.get(i).add(i);
            BOARD.get(i).add(j);
        }
        System.out.println("break");
        System.out.println();
    }
}

"First Iteration"
i 0 j 0
i 0 j 1
i 0 j 2
i 0 j 3
i 0 j 4
i 0 j 5
i 0 j 6
i 0 j 7
break

Однако на самом деле он не помещает правильные элементы в списки и возвращает следующее:

[[0, 7], [1, 7], [2, 7], [3, 7], [4, 7], [5, 7], [6, 7], [7, 7], [7, 6], [7, 5], [7, 4], [7, 3], [7, 2], [7, 1], [7, 0], [6, 6], [6, 5], [6, 4], [6, 3], [6, 2], [6, 1], [6, 0], [5, 6], [5, 5], [5, 4], [5, 3], [5, 2], [5, 1], [5, 0], [4, 6], [4, 5], [4, 4], [4, 3], [4, 2], [4, 1], [4, 0], [3, 6], [3, 5], [3, 4], [3, 3], [3, 2], [3, 1], [3, 0], [2, 6], [2, 5], [2, 4], [2, 3], [2, 2], [2, 1], [2, 0], [1, 6], [1, 5], [1, 4], [1, 3], [1, 2], [1, 1], [1, 0], [0, 6], [0, 5], [0, 4], [0, 3], [0, 2], [0, 1], [0, 0]]

Я явно что-то здесь упускаю, я кодирую уже несколько часов и, похоже, не вижу ошибки. Это характеристика c коллекций? Я думал, что только очереди будут вести себя так; но опять же я не совсем уверен.

Ответы [ 2 ]

3 голосов
/ 23 апреля 2020

Ваша проблема в том, что вы создаете в каждой итерации для j новый ArrayList, который заменяет старый. Переместите его на верхний l oop, и он будет работать. Попробуйте это:

for (int i = 0; i < 8; i++) {
    BOARD.add(i, new ArrayList<>());
    for (int j = 0; j < 8; j++) {
        System.out.println("i " + i + " j " + j);
        BOARD.get(i).add(i);
        BOARD.get(i).add(j);
    }
    System.out.println("break");
    System.out.println();
}

Вывод первой итерации:

i 0 j 0

i 0 j 1

i 0 j 2

i 0 j 3

i 0 j 4

i 0 j 5

i 0 j 6

i 0 j 7

перерыв


Обновленные требования

for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 8; j++) {
        final ArrayList<Integer> array = new ArrayList<>();
        array.add(i);
        array.add(j);
        BOARD.add(array);
        System.out.println("i " + i + " j " + j);
    }
    System.out.println("break");
    System.out.println();
}

Результирующий массив:

[[0, 0], [0, 1], [0, 2], [0, 3], [0, 4], [0, 5], [0, 6], [0, 7], [1, 0], [1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 0], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [3, 0], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7], [4, 0], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [4, 7], [5, 0], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [6, 0], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6], [6, 7], [7, 0], [7, 1], [7, 2], [7, 3], [7, 4], [7, 5], [7, 6], [7, 7]]
2 голосов
/ 23 апреля 2020

РЕДАКТИРОВАТЬ: Я добавил создание new ArrayList<>() к первому l oop, чтобы для каждого индекса внешнего списка был список

Попробуйте код ниже и проверьте :

static List<ArrayList<Integer>> BOARD = new ArrayList<>();

static {
    for (int i = 0; i < 8; i++) {
       BOARD.add(i, new ArrayList<>());
       for (int j = 0; j < 8; j++) {
            System.out.println("i "+i + " j "+j);
            BOARD.get(i).add(i);
            BOARD.get(i).add(j);
        }
        System.out.println("break");
        System.out.println();
    }
}

РЕДАКТИРОВАТЬ-2:

for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                ArrayList<Integer> integers = new ArrayList<>();
                integers.add(i);
                integers.add(j);
                BOARD.add(integers);
            }
            System.out.println("break");
            System.out.println();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...