如何随机化枚举元素?

发布于 2024-12-15 13:26:45 字数 554 浏览 3 评论 0原文

假设您有一个包含一些元素的enum

public enum LightColor {
   RED, YELLOW, GREEN
}

,并且想从中随机选择任何颜色。

我将颜色放入 a

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));

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

Say you have an enum with some elements

public enum LightColor {
   RED, YELLOW, GREEN
}

And would like to randomly pick any color from it.

I put colors into a

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

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

And then picked a random color like:

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

All of this (while working fine) seems needlessly complicated. Is there a simplier way to pick a random enum element?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

木格 2024-12-22 13:26:45

Java 的枚举实际上是功能齐全的对象。您可以将一个方法添加到 enum 声明中,

public enum LightColor {
    Green,
    Yellow,
    Red;

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

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

LightColor randomLightColor = LightColor.getRandom();

Java's enums are actually fully capable Objects. You can add a method to the enum declaration

public enum LightColor {
    Green,
    Yellow,
    Red;

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

Which would allow you to use it like this:

LightColor randomLightColor = LightColor.getRandom();
够钟 2024-12-22 13:26:45
LightColor random = LightColor.values()[(int)(Math.random()*(LightColor.values().length))];
LightColor random = LightColor.values()[(int)(Math.random()*(LightColor.values().length))];
苍景流年 2024-12-22 13:26:45

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

Use Enum.values() to get all available options and use the Random.nextInt() method specifying the max value. eg:

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

This can then be called as such:

LightColor randomColor = randomElement(LightColor.values());
黑白记忆 2024-12-22 13:26:45

这应该很简单,如下所示

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

This should be just easy as shown below

LightColor[] values = LightColor.values();
LightColor value = values[(int) (Math.random() * 3)];
豆芽 2024-12-22 13:26:45

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

Tiberiu

You could associate an integer id to each enum color, and have a valueOf(int id) method that returns the corresponding color. This will help you get rid of the list..

Tiberiu

枫林﹌晚霞¤ 2024-12-22 13:26:45

因此,阅读 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;
}

甚至可以有一个黑名单。

So reading Kowser's answer, I came up with something here.
Given an enum ChatColor containing different colors, you could do the following:

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;
}

and even have a blacklist.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文