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



我正在尝试遍历包含随机生成的 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 循环,但不太明白为什么只访问所有其他元素。 任何帮助或建议将不胜感激。 谢谢。

此代码不会执行您认为的功能:

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

requestCopy = tempRequests更改requestCopy变量以引用与tempRequests变量相同的Vector对象,从而放弃对在上一行中创建的Vector对象的引用。

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

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

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

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

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

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

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

Vector<Integer> requestCopy = new Vector<Integer>();这一行,您创建了新矢量,然后将该新矢量对象替换为引用 tempRequests 的对象。您不能以这种方式复制对象。

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

我希望对您有所帮助,谢谢。

修改你的 if from

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))
}

相关内容

最新更新