如何随机化枚举元素?

Jam*_*sev 11 java random enums

假设你有enum一些元素

public enum LightColor {
   RED, YELLOW, GREEN
}
Run Code Online (Sandbox Code Playgroud)

并希望从中随机挑选任何颜色.

我把颜色放进去了

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

lightColorChoices.add(LightColor.GREEN);
lightColorChoices.add(LightColor.YELLOW);
lightColorChoices.add(LightColor.RED);
Run Code Online (Sandbox Code Playgroud)

然后选择一个随机颜色:

this.lightColor = lightColorChoices.get((int) (Math.random() * 3));
Run Code Online (Sandbox Code Playgroud)

所有这些(虽然工作正常)似乎不必要地复杂化.是否有更简单的方法来选择随机枚举元素?

Luc*_*cas 23

Java的枚举实际上是完全有能力的对象.您可以在enum声明中添加方法

public enum LightColor {
    Green,
    Yellow,
    Red;

    public static LightColor getRandom() {
        return values()[(int) (Math.random() * values().length)];
    }
}
Run Code Online (Sandbox Code Playgroud)

哪个允许你像这样使用它:

LightColor randomLightColor = LightColor.getRandom();
Run Code Online (Sandbox Code Playgroud)


b_e*_*erb 8

LightColor random = LightColor.values()[(int)(Math.random()*(LightColor.values().length))];
Run Code Online (Sandbox Code Playgroud)


Ric*_*lly 5

使用Enum.values()获取所有可用选项,并使用指定最大值的Random.nextInt()方法.例如:

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

然后可以这样调用:

LightColor randomColor = randomElement(LightColor.values());
Run Code Online (Sandbox Code Playgroud)