如何随机化枚举元素?

时间:2011-11-13 19:46:41

标签: java random enums

假设您有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));

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

6 个答案:

答案 0 :(得分:23)

Java的枚举实际上是完全有能力的对象。您可以在enum声明

中添加方法
public enum LightColor {
    Green,
    Yellow,
    Red;

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

允许你像这样使用它:

LightColor randomLightColor = LightColor.getRandom();

答案 1 :(得分:8)

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

答案 2 :(得分:5)

使用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());

答案 3 :(得分:3)

这应该很简单,如下所示

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

答案 4 :(得分:0)

您可以将整数id与每个枚举颜色相关联,并使用valueOf(int id)方法返回相应的颜色。这将帮助您摆脱列表..

Tiberiu

答案 5 :(得分:0)

所以阅读Kowser的回答,我在这里提出了一些建议。 给定包含不同颜色的枚举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;
}

甚至有黑名单。