【问题标题】:How to randomize enum elements? [duplicate]如何随机化枚举元素? [复制]
【发布时间】:2011-12-28 04:31:35
【问题描述】:

假设你有一个带有一些元素的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));

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

【问题讨论】:

标签: java random enums


【解决方案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());
    

    【讨论】:

    • +1 建议使用 Random.nextInt() 而不是乘以大小
    【解决方案4】:

    这应该很简单,如下所示

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

    【讨论】:

      【解决方案5】:

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

      提比略

      【讨论】:

        【解决方案6】:

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

        甚至还有黑名单。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-05-18
          • 2020-05-04
          • 1970-01-01
          • 2016-02-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-25
          相关资源
          最近更新 更多