Как рандомизировать элементы перечисления?

Скажите, что у вас есть enum с некоторыми элементами

public enum LightColor {
   RED, YELLOW, GREEN
}

И хотел бы случайно выбрать любой цвет из него.

Я поместил цвета в

public List<LightColor> lightColorChoices = new ArrayList<LightColor>();

lightColorChoices.add(LightColor.GREEN);
lightColorChoices.add(LightColor.YELLOW);
lightColorChoices.add(LightColor.RED);

И затем выбрал случайный цвет, например:

this.lightColor = lightColorChoices.get((int) (Math.random() * 3));

Все это (при работе отлично) кажется излишне сложным. Есть ли более простой способ выбрать случайный элемент перечисления?

Ответ 1

Java перечисления фактически являются полностью способными объектами. Вы можете добавить метод к объявлению enum

public enum LightColor {
    Green,
    Yellow,
    Red;

    public static LightColor getRandom() {
        return values()[(int) (Math.random() * values().length)];
    }
}

Это позволит вам использовать его следующим образом:

LightColor randomLightColor = LightColor.getRandom();

Ответ 2

LightColor random = LightColor.values()[(int)(Math.random()*(LightColor.values().length))];

Ответ 3

Используйте Enum.values ​​(), чтобы получить все доступные параметры и использовать Метод Random.nextInt(), определяющий максимальное значение. например:

private static Random numberGenerator = new Random();
public <T> T randomElement(T[] elements)
  return elements[numberGenerator.nextInt(elements.length)];
}

Затем это можно вызвать как таковое:

LightColor randomColor = randomElement(LightColor.values());

Ответ 4

Это должно быть просто, как показано ниже

LightColor[] values = LightColor.values();
LightColor value = values[(int) (Math.random() * 3)];

Ответ 5

Вы можете связать целочисленный идентификатор с каждым цветом перечисления и иметь метод valueOf (int id), который возвращает соответствующий цвет. Это поможет вам избавиться от списка.

Тибериу

Ответ 6

Поэтому, читая ответ Коузера, я придумал что-то здесь. Учитывая перечисление ChatColor, содержащее разные цвета, вы можете сделать следующее:

private ChatColor getRandomColor() {
    ChatColor randomColor = ChatColor.values()[random.nextInt(ChatColor
            .values().length - 1)];
    ChatColor[] blacklist = { ChatColor.BOLD, ChatColor.ITALIC,
            ChatColor.MAGIC, ChatColor.RESET, ChatColor.STRIKETHROUGH,
            ChatColor.UNDERLINE };
    while (Arrays.asList(blacklist).contains(randomColor)) {
        randomColor = ChatColor.values()[random
                .nextInt(ChatColor.values().length)];
    }
    return randomColor;
}

и даже иметь черный список.