我试图将多个枚举值随机化,而不会多次分配相同的枚举值。
例如:
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
我需要,一旦枚举值输出,就不能再次输出,如果是,则抛出异常/错误,表示没有值。
由于
答案 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);
}
}
}