Java перечисления и массивы - PullRequest
2 голосов
/ 12 декабря 2011

У меня есть некоторый код C ++, который я портирую на Java.

Мой код выглядит примерно так @

enum direction {UP, DOWN, LEFT, RIGHT, NEUTRAL};
int LINK[5];
.....
//fill LINK array
.....
if (desired_direction == LEFT  ) || (LINK[LEFT]  > 0) return true;
if (desired_direction == RIGHT ) || (LINK[RIGHT] > 0) return true;
if (desired_direction == UP    ) || (LINK[UP]    > 0) return true;
if (desired_direction == DOWN  ) || (LINK[DOWN]  > 0) return true;

Итак, у меня есть массив, заполненный целыми числами, и я использую enumдля индекса массива.

Что такое Java-способ для этого?

Спасибо

Ответы [ 4 ]

2 голосов
/ 12 декабря 2011

Вы можете использовать EnumSet вместо целочисленного массива. У перечислений в Java есть целое число, связанное с каждым экземпляром (полученным из метода ordinal(), который можно использовать, чтобы сохранить приведенный выше код как есть), а EnumSet реализован с использованием длинного битового поля (ну, это RegularEnumSet и есть альтернативная реализация для перечислений с более чем 64 членами - выбор инкапсулирован).

Так что вроде:

EnumSet<Direction> links = EnumSet.noneOf(Direction.class);
// populate links (links.add(Direction.UP) etc)
if (desired_direction == LEFT || links.contains(Direction.LEFT)) return true;
// etc...
2 голосов
/ 12 декабря 2011

В принципе, ничто не отличается.

Фактически, единственное, чего здесь не хватает, это скобки вокруг двух условий каждого if оператора.

Кроме того, ваш вызов значения enum будет direction.whatever.ordinal() вместо whatever.

1 голос
/ 12 декабря 2011

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

public enum Direction {
    UP(0), DOWN(1), LEFT(2), RIGHT(3), NEUTRAL(4);
    private Integer index;

    Direction(Integer index){
        this.index = index;
    };

    public Integer getIndex(){
        return this.index;
    }
}

и затем ваши операторы if:

Direction desired_direction = Direction.LEFT;
int[] LINK = {2,0,0,0,0};
if (desired_direction == Direction.LEFT  || LINK[Direction.LEFT.getIndex()]  > 0){
 return true;
}

Или вы можете ссылаться на метод ordinal () вместопростота создания индекса Integer.Примерно так: LINK[Direction.LEFT.ordinal()] > 0

Однако, возможно, было бы целесообразно использовать хэш-карту (хотя логика не совсем совпадает с вашим вопросом:

Map<Direction, Integer> myLink = new HashMap<Direction, Integer>(5);
        myLink.put(Direction.LEFT, 2);
        myLink.put(Direction.RIGHT, 0);
        myLink.put(Direction.UP, 0);
        myLink.put(Direction.DOWN, 0);

        if(myLink.get(desired_direction) > 0) 
        {
            return true;
        }

Но мой любимый способ - использовать всю логикусамо перечисление, а затем передача массива int в качестве параметра:

public Boolean getAnalysis(int[] link){
  return link[this.getIndex()]  > 0 ? Boolean.TRUE:Boolean.FALSE; 
}

Мне также нравится явно задавать свойство индекса, а не полагаться на порядковый номер, на случай, если кто-то изменит перечисление в будущем и ваш вызовхотел бы это

Direction desired_direction = Direction.LEFT;
return desired_direction.getAnalysis(LINK);
1 голос
/ 12 декабря 2011

Вы можете выполнить итерацию по направлению []:

direction[] enumVals = direction.values();
for(direction dir: enumVals) {
    if ((dir == direction.LEFT  ) || (LINK[dir.ordinal()]  > 0))
        return true;
}

enumName.values() возвращает enumName[], который содержит все элементы перечисления.

Обратите внимание, что вы не можете использоватьenum-элемент прямо как число.Вам необходимо позвонить (например) direction.LEFT.ordinal(), чтобы получить порядковый номер 0 элемента в перечислении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...