Java 从arraylist中随机拾取唯一项
假设我想从如下数组列表中选择5种随机颜色:Java 从arraylist中随机拾取唯一项,java,arraylist,Java,Arraylist,假设我想从如下数组列表中选择5种随机颜色: static final List<Color> colors = new ArrayList<Color>(); static { colors.add(Color.RED); colors.add(Color.BLUE); colors.add(Color.GREEN); } 但是如果我想选择不同的独特颜色呢?所以说我选红色,我怎么能保证不再选红色;最好不要将其从列表中删除 编辑: 我发现了一些有
static final List<Color> colors = new ArrayList<Color>();
static {
colors.add(Color.RED);
colors.add(Color.BLUE);
colors.add(Color.GREEN);
}
但是如果我想选择不同的独特颜色呢?所以说我选红色,我怎么能保证不再选红色;最好不要将其从列表中删除
编辑:
我发现了一些有效的方法:
Color generatedColor = Theme.randomColor();
for (int i = 0; i < pie.segments.size(); i++) {
if (generatedColor == pie.segments.get(i).getColor()) {
generatedColor = Theme.randomColor();
return;
}
}
this.color = generatedColor;
Color-generatedColor=Theme.randomColor();
对于(int i=0;i
然而,有人建议我将它们全部删除,并在完成所有生成后重新添加,我应该选择哪种方法
编辑2:
洗牌后,我得到了以下结果:
谢谢!:) 使用
remove
方法,将对象返回到该位置,然后将其移除
然后,您的方法变成:
public static Color getRandomColor() {
return colors.remove(random.nextInt(colors.size());
}
当列表大小为0时,请重新插入所有颜色。尝试
集合。无序移动(列表)
并选择前N种颜色。你想这样做吗?我考虑过,但不是给它一个完整的类,我会尝试一下。你对“暴力强迫”有什么看法?e、 g我有一系列使用颜色的东西,我会生成一个颜色检查,如果它被使用过,如果它已经再生了?我从来没有听说过洗牌?我会调查一下:)--edit:我认为洗牌在这里是没有用的,洗牌正是你想要的。将其洗牌,然后选择第一个元素,然后选择第二个元素,依此类推。如果你不想让它修改你的数组,复制一个副本,然后洗牌。我认为删除每个元素没有那么有效。我猜别人提到的Shuffle是一个更好的选择。+1虽然没有Shuffle那么有效,但这是一个最小的改变。以这个解决方案结束,是一个最小的麻烦。我遇到的大多数错误都是我自己的愚蠢。我真的不知道集合是如何工作的。Shuffle(List)工作的,但是如果我可以猜的话,每次使用此方法时,整个列表都会重新组合,例如使用当前元素到随机元素之间的交换。。。。这可能比简单地从列表中删除一个元素效率低得多。同样,使用此方法,您可以确保如果列表大小为N,则在调用get Random Color in times后,每个颜色都返回了i次
public static Color getRandomColor() {
return colors.remove(random.nextInt(colors.size());
}