Создание списков с одинаковыми элементами в Java

class Board {
    Direction[][] board;
    Integer width;
    Integer height;

    Board(Integer width, Integer height) {
        this.width = width;
        this.height = height;

        board = new Direction[width][height];

        for (Integer y = 0; y < height; y++) {
            for (Integer x = 0; x < width; x++) {
                board[x][y] = Direction.Down;
            }
        }   
    }

    Direction direction(Integer x, Integer y) {
        return board[x][y];
    }

    void update(Integer x, Integer y) {
        board[x][y].next();
    }
}

Перечисленные значения в Direction: Up или Down

Во-первых, я хочу инициализировать свою плату, чтобы все начальные значения в каждом месте платы были установлены на Down.

Во-вторых, я хочу получить значение в определенной (x, y) позиции доски.

В-третьих, я хочу иметь возможность обновлять значение в этом конкретном элементе доски. Функция next() предназначена для изменения значения с Down на Up или наоборот. Об этом объявляется отдельно.

Я считаю, что делаю что-то неправильно, когда код компилируется, однако моя программа не работает должным образом.


person maclunian    schedule 27.06.2011    source источник
comment
однако моя программа не работает должным образом. А поточнее?   -  person toto2    schedule 27.06.2011
comment
Ваша плата не инициализируется правильно?   -  person Kal    schedule 27.06.2011
comment
@toto По сути, когда я пытаюсь запустить программу, я получаю пустой экран с относительным цветом фона для Down, определенным в другом месте. Больше ничего не происходит. Точно так же, если я установил Direction.Up выше, появляется другой цвет, но ничего не происходит.   -  person maclunian    schedule 27.06.2011
comment
Я думаю, что board инициализируется правильно @Kal. Я думаю, что проблема может быть в функции void update(Integer x, Integer y){...}.   -  person maclunian    schedule 27.06.2011
comment
Вам нужно быть более конкретным в том, что происходит, потому что из вашего описания это звучит как проблема с пользовательским интерфейсом. Это означает, что код не имеет отношения к проблеме.   -  person drekka    schedule 27.06.2011
comment
@Derek Значит, код в порядке?   -  person maclunian    schedule 27.06.2011
comment
@maclunian Я думаю, вы используете графический интерфейс. Тогда ваша наиболее вероятная проблема заключается в том, что ваши данные не синхронизированы с потоком отправки событий Swing (EDT) (плата в памяти для потока Swing такая же, как и модифицированная плата). [EDIT: ответы ниже об использовании next тоже имеют смысл.]   -  person toto2    schedule 27.06.2011
comment
Есть ли причина, по которой вы используете int вместо Integer? См. этот пост, в котором описывается разница между примитивные типы и ссылочные типы.   -  person Jay Elston    schedule 27.06.2011
comment
@maclunian: Пожалуйста, не удаляйте код, без него ответы не понять.   -  person Paŭlo Ebermann    schedule 27.06.2011


Ответы (2)


Скорее всего, вы хотите изменить код обновления следующим образом:

board[x][y] = board[x][y].next();

Конечно, я многое предполагаю о том, что не работает с вашим кодом, но это распространенная ошибка, с которой я уже сталкивался.

person Ben Hocking    schedule 27.06.2011

Если проблема в вашем методе обновления:

Значения типа enum должны быть неизменяемыми. Вызов метода next() для него может изменить объект перечисления (в зависимости от его реализации), но поскольку вы используете один и тот же объект во всех позициях вашего массива, все они тоже изменятся.

Возможно, вы захотите использовать что-то вроде этого:

board[x][y] = board[x][y].next();

с участием

enum Direction {

    UP, DOWN;

    public Direction next() {
        if (this == UP)
           return DOWN;
        else
           return UP;
    }
}
person Paŭlo Ebermann    schedule 27.06.2011
comment
или еще проще: return this == UP ? DOWN : UP; - person Bohemian♦; 27.06.2011
comment
@Bohemian У меня есть что-то похожее на то, что есть у @Paŭlo Ebermann, за исключением того, что в начале не говорится об общедоступности. Будет ли это иметь значение? - person maclunian; 27.06.2011
comment
@maclunian: проблема не в методе next, а в том, как вы его называете. Вам нужно как-то использовать результат, назначив его в правильную позицию массива доски. - person Paŭlo Ebermann; 27.06.2011