如何随机化枚举元素?

假设你有一些包含一些元素的enum

 public enum LightColor { RED, YELLOW, GREEN } 

并想随意挑选任何颜色。

我把颜色放进去了

 public List lightColorChoices = new ArrayList(); lightColorChoices.add(LightColor.GREEN); lightColorChoices.add(LightColor.YELLOW); lightColorChoices.add(LightColor.RED); 

然后选择一个随机颜色:

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

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

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

 public enum LightColor { Green, Yellow, Red; public static LightColor getRandom() { return values()[(int) (Math.random() * values().length)]; } } 

这将允许您像这样使用它:

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

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

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

然后可以这样调用:

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

这应该很简单,如下所示

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

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

Tiberiu

所以阅读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; } 

甚至有一个黑名单。