如何在不接收重复项的情况下随机化一定数量的枚举值?

时间:2013-08-01 14:46:52

标签: java random enums

我试图将多个枚举值随机化,而不会多次分配相同的枚举值。

例如:

public class Strings {

   public enum String {HELLO, WORLD, HELLOWORLD, HELLOAGAIN};

     private static final List<Strings> VALUES =
          Collections.unmodifiableList(Arrays.asList(values()));
          private static final int SIZE = VALUES.size();
          private static final Random RANDOM = new Random();

          public static Strings randomString()  {
            return VALUES.get(RANDOM.nextInt(SIZE));
          }
        }
}

当我从我的主要调用此方法时,我会得到(或类似)的输出:

HELLO
HELLO
HELLO
WORLD

我需要,一旦枚举值输出,就不能再次输出,如果是,则抛出异常/错误,表示没有值。

由于

3 个答案:

答案 0 :(得分:2)

好吧,每次你想要一个随机值,你都可以使用Collections.shuffle(List<?>)来收集你的收藏品。然后删除并获取1 st 元素。这样,你就不会得到副本。是的,您不应该使用不可修改的列表。你会修改它。

请为您的enum提供其他名称。 String已经是Java API中定义的类。

您可以尝试以下代码:

class Strings {
     enum Test {HELLO, WORLD, HELLOWORLD, HELLOAGAIN};

     private static final List<Test> VALUES = new ArrayList<>(Arrays.asList(Test.values()));

     public static Test randomString()  {
            Collections.shuffle(VALUES);
            return VALUES.remove(0);
     }
}

答案 1 :(得分:2)

为什么不将每个枚举值插入到由随机数键入的地图中?让randomString()按键顺序遍历地图。当它到达地图的末尾时,它可以指示没有剩余值。

@Jeff - 好的:-)这里有一些东西可以证明我在说什么。你只需要“洗牌”一次然后使用结果。

public class TestApp
{
    public enum Test {HELLO, WORLD, HELLOWORLD, HELLOAGAIN};

    public static void main( String[] args )
    {
        Map<Integer,String> map = new TreeMap<Integer,String>();

        Test[] tests = Test.values();
        Random random = new Random();

        for ( Test t : tests )
            map.put( random.nextInt(), t.name() );

        for ( Map.Entry<Integer,String> e : map.entrySet() ) 
            System.out.println( e.getValue() );
    }
}

答案 2 :(得分:1)

我同意Rohit。使用Collections.shuffle()将是一个简单的解决方案,以随机顺序回显枚举值,也没有重复。示例代码:

public class Strings {
    public enum Message { HELLO, WORLD, HELLOWORLD, HELLOAGAIN };

    public static void main(String[] args) {
        List<Message> shuffled = Arrays.asList(Message.values());
        Collections.shuffle(shuffled);
        for (Message msg : shuffled) {
            System.out.println(msg);
        }
    }
}