在向量中的元素上进行迭代,以循环方式从最后一个元素到第一个元素环绕

时间:2019-07-25 20:59:52

标签: java vector iteration

我正在尝试遍历包含随机生成的int值的已排序矢量对象。想法是访问每个元素,输出其值,然后继续下一个元素。

问题是我的迭代仅访问/输出每个其他元素,而不是每个元素。我的代码如下:

    //note 'tempRequests' is a vector object containing randomly generated 
    //int values 

    int i = 0;

    Collections.sort(tempRequests);

    System.out.println("request vector is now: ");
    System.out.println(tempRequests);

    Vector<Integer> requestCopy = new Vector<Integer>();
    requestCopy = tempRequests;


    //for (int i = currentPosition; i < tempRequests.size()-1; i++)
    while (requestCopy.size() > 0)
    {   
        if (requestCopy.contains(tempRequests.get(i)))
        {
            System.out.println("Processing " + tempRequests.get(i));
            requestCopy.removeElement(tempRequests.get(i));
        }

        if (i+1 <= tempRequests.size()-1)
            i++;
        else
            i = 0;  
    }

我得到以下具有不同随机生成的int值的输出:

request vector is now: 
[172, 548, 568, 632, 698, 779, 886, 950, 1011]
Processing 172
Processing 568
Processing 698
Processing 886
Processing 1011
Processing 548
Processing 779
Processing 632
Processing 950
Vector queue empty, consumer waiting...

我尝试调整for循环,但不太了解为什么只访问其他每个元素。任何帮助或建议,将不胜感激。谢谢。

4 个答案:

答案 0 :(得分:2)

此代码不执行您认为的操作:

Vector<Integer> requestCopy = new Vector<Integer>();
requestCopy = tempRequests;

requestCopy = tempRequestsrequestCopy变量更改为与Vector变量引用相同 tempRequests对象,放弃对{{ 1}}对象是在上一行中创建的。

您打算做的是Vector 复制requestCopy.addAll(tempRequests)向量到刚刚创建的新向量的元素。

更好的方法是使用复制构造函数:

tempRequests

答案 1 :(得分:2)

由于您要做的只是在Vector上进行迭代并打印出值,而不是创建副本并且必须管理副本中的打印和删除元素,因此请考虑使用Iterator。

Iterator value = tempRequests.iterator();
while(value.hasNext()){
    System.out.println("Processing: " + value.next());
}

以上四行将替换创建requestCopy矢量的所有代码以及您拥有的整个while循环。

答案 2 :(得分:1)

我认为您的requestCopy和tempRequests是对一个矢量对象的两个引用。

Vector<Integer> requestCopy = new Vector<Integer>();这行代码创建了新的vector,然后用引用tempRequests的Object替换了新的Vector Object。您不能以这种方式复制Object。

删除requestCopy = tempRequests;并将Vector<Integer> requestCopy = new Vector<Integer>();更新为Vector<Integer> requestCopy = new Vector<Integer>(tempRequests); 然后它将起作用。

希望对您有所帮助。

答案 3 :(得分:-2)

修改您的条件

if (requestCopy.contains(tempRequests.get(i))) {
    System.out.println("Processing " + tempRequests.get(i));      
    requestCopy.removeElement(tempRequests.get(i));
}

System.out.println("Processing " + tempRequests.get(i));
if (requestCopy.contains(tempRequests.get(i))) {
    requestCopy.removeElement(tempRequests.get(i))
}