1

我正在尝试随机化多个枚举值而不多次分配相同的枚举值。

例如:

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

当我从我的 main 调用这个方法时,我会得到(或类似)的输出:

HELLO
HELLO
HELLO
WORLD

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

谢谢

4

3 回答 3

2

好吧,每次你想要一个随机值时,你都可以使用Collections.shuffle(List<?>). 然后删除并获取第一个元素。这样,您将不会得到副本。是的,你不应该使用不可修改的列表。因为您将对其进行修改。

请给您的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);
     }
}
于 2013-08-01T14:49:20.373 回答
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() );
    }
}
于 2013-08-01T14:51:17.553 回答
1

我同意罗希特的观点。使用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);
        }
    }
}
于 2013-08-01T14:56:05.880 回答