如何在Java中随机打印向量的内容?

如何在Java中随机打印向量的内容?,java,random,vector,Java,Random,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.con

我需要在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是我的随机生成器,以时间为种子。它以随机顺序打印,但仍然打印副本


有什么建议吗?

首先,没有理由使用。自Java1.2以来,它实际上已经被弃用了超过10年。改用

还要注意,调用Random.nextInt%max是一种反模式,会破坏生成器的随机性。如果希望整数的范围小于Random.nextInt,请始终调用Random.nextinmax-后一种方法的设计目的是做正确的事情,并为您提供均匀分布

好的,所以你想要去除重复的,你也想要以任意的方式打印,或者你字面上的意思是随机的?秩序

实现这两个目标的最简单的方法是使用一个。值得注意的是,公共集合实现是显式无序的,这意味着它们添加的顺序不一定是它们返回的顺序

因此,您可以简单地执行以下操作:

List<Integer> ls = ...;
for(Integer i : new HashSet<Integer>(ls)) {
  System.out.println(i);
}
这将以随机*顺序打印ls的唯一元素

*从技术上讲,它是伪随机的,但不必担心这一点。它足够随机。

Collections.shufflevector 然后将输出放在一个集合中,不要使用SortedSet。
您现在已经随机删除了重复项。

您可以这样初始化向量:

Vector<Integer> printed = new Vector<Integer>();
但是,您刚刚初始化printed以包含零个元素

因此,printed.containsn将始终为false


因此,print永远不会被设置为false,v中的所有元素都将被打印到控制台。

如果您不想重复,为什么不使用set?我也不知道你为什么要用contains和elementAt来表示n。包含检查整数是否不在向量中,elementAt返回给定索引处的元素。打印的向量正在循环内实例化,这意味着每次迭代都会给出一个新向量,并且不会保持持久性,请尝试将其置于循环外。如果不需要线程安全的实现,建议使用ArrayList代替Vector。不要使用向量。这是一个非常好的答案。也许作为一种改进,您希望先将所有内容添加到集合中,然后再进行洗牌。如果有很多重复项,这可能会造成显著的性能差异。不仅重复数据消除首先更有效,而且洗牌列表然后将其放入哈希集或类似文件将有效消除洗牌带来的随机性。Guava的ImmutableSet确实保留了插入顺序,但是通常不能指望集合提供这种保证,HashSet的顺序不是随机的。谢谢,伙计们。不幸的是,我不得不在作业中使用向量。最后,我使用了一个布尔数组来检查是否已经打印了字符串:boolean[]check=new boolean[v.size];forint a=0;aVector<Integer> printed = new Vector<Integer>();
if(printed.contains(n))