编辑:感谢您的所有快速回复。现在我看到作业不起作用。从另一个线程我读到,Java中的迭代器比C ++中的迭代器强大得多。请问为什么在Java中使用iterator?只是为了取代“for”循环?感谢。
一些注意事项:
我不介意使用两个“for”循环,但我知道Java对所有这些库都非常强大。我只是好奇是否有比两个“for”循环更好的方法。感谢。
您好,
我一直在使用C ++,但我是Java的新手,所以请耐心等待。我尝试使用两个迭代器遍历ArrayList。第一个迭代器遍历列表,第二个迭代器从第一个迭代器指向的位置开始,一直到列表的末尾。以下代码是我想要做的(虽然可能无效):
.......; //initialize aList here ......
Iterator aItr = aList.iterator();
while(aItr.hasNext()){
int a = aItr.next();
Iterator bItr = aItr; //-----> is it valid? Any bad consequence?
while (bItr.hasNext()){
............; //do stuff
}
}
将一个迭代器分配给另一个迭代器是否有效?如果没有,那么做我想做的最好的方法是什么?谢谢。
我知道它在C ++中有效但不确定Java,我搜索了很多但是所有结果都使用迭代器来打印一些东西。非常感谢你的帮助。
答案 0 :(得分:7)
你不应该这样做:
Iterator bIter = aIter;
因为Java中没有复制构造函数等; bIter将引用相同的底层迭代器。
你可以以这种方式使用ListIterator:
ListIterator aItr = aList.listIterator();
while (aItr.hasNext()) {
int a = aItr.next();
ListIterator bItr = aList.listIterator(aItr.previousIndex());
while (bItr.hasNext()) {
// ...
}
}
但是如果你认为ListIterator应该有一个copy()方法或类似的东西,我同意你的意见......
答案 1 :(得分:5)
如果你想要列表中位置n的第二个列表迭代器,那么使用List#listIterator(int index):
ListIterator bIter = list.listIterator(n);
答案 2 :(得分:2)
由于您似乎在使用列表,因此在您的情况下最简单的解决方案是使用两个索引,如下所示:
for (int i = 0; i < aList.size(); i++) {
for (int j = i; j < aList.size(); j++) {
// do stuff with aList's elements
aList.get(j);
}
}
使用迭代器,你可以实现类似的东西,但你必须为内循环构造新的迭代器,可能来自
aList.subList(i, aList.size()).iterator();
答案 3 :(得分:2)
这是有效的,但它不会做你想做的事。你仍然只有一个迭代器,外部循环将在内部循环第一次终止后终止。
无法有意义地复制Java迭代器。你必须使用一个简单的for循环来增加索引。
答案 4 :(得分:0)
这样做:
ArrayList<String> aList = new ArrayList<String>();
// do something to fill the list
for (int i = 0; i < aList.size(); i++)
{
ArrayList<String> bList = aList.subList(i, aList.size());
for (int j = 0; j < bList.size(); j++)
{
// do stuff with the sublist
}
}
重要的是要注意bList由aList支持,因此对bList的更改将反映在aList中...进行非结构性更改只是为了保持理智。