我需要以随机顺序打印Vector的内容,而不需要Java中的重复项。到目前为止我有这个:
for(int p = 0; p < v.size(); p++) {
boolean print = true;
int n = Math.abs(r.nextInt() % v.size());
Vector<Integer> printed = new Vector<Integer>();
if(printed.contains(n))
print = false;
if(print)
System.out.println(v.elementAt(n));
printed.addElement(n);
}
其中“v”是我的字符串向量,“r”是我的随机生成器(按时间播种)。它以随机顺序打印,但仍然打印重复。
有什么建议吗?
答案 0 :(得分:0)
首先,没有理由使用Vector
。自Java 1.2以来,它已被有效地弃用,超过15 years ago。请改用ArrayList
。
另请注意,调用Random.nextInt() % max
是反模式,会破坏生成器的随机性。如果您希望整数范围小于Random.nextInt(max)
,请始终致电Random.nextInt()
- 后一种方法旨在做正确的事情并为您提供均匀分布。
好的,所以你想要删除重复项,并且你也想要以任意(或者你的字面意思是随机?)顺序打印。
实现这两个目标的最简单方法是使用Set
。常见的Set
实现,特别是HashSet
,是明确无序的,这意味着它们的添加顺序不一定是它们返回的顺序。
所以你可以简单地做到以下几点:
List<Integer> ls = ...;
for(Integer i : new HashSet<Integer>(ls)) {
System.out.println(i);
}
然而就像我说的那样,任意顺序和正确随机之间存在差异。 HashSet
是任意的,但在其实现中存在潜在的可预测模式,因此无法调用上述代码的输出&#34; random&#34;。
如果你真的想要随机排序,你最好的选择是Collections.shuffle()
函数,它接受一个列表并对其进行洗牌,这样每个元素几乎同样可能位于列表中的任何位置。这是一些示例代码(注意我们必须首先通过HashSet
来删除重复项):
List<Integer> ls = ...;
ls = new ArrayList<Integer>(new HashSet<Integer>(ls));
Collections.shuffle(ls);
for(Integer i : ls) {
System.out.println(i);
}
这将以随机*顺序打印ls
的唯一元素。
*从技术上讲,它是伪随机的,但没有必要担心。它已足够随机了。
答案 1 :(得分:0)
Collections.shuffle(矢量) 然后获取输出并将其放入一组(不要使用SortedSet)。 您现在已经随机化并删除了重复项。
答案 2 :(得分:0)
您可以像这样初始化Vector:
Vector<Integer> printed = new Vector<Integer>();
然后检查printed
是否包含某些内容:
if(printed.contains(n))
但是,您刚刚初始化printed
以包含零元素。
因此,printed.contains(n)
始终为false
。
因此,print
永远不会设置为false
,v
中的所有元素都会打印到控制台。