我正在尝试遍历包含随机生成的 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))
}