在一个ArrayList中使用两个迭代器

编辑:感谢您的所有提示回复。 现在我看到作业不起作用。 从另一个线程我读到,Java中的迭代器比C ++中的迭代器强大得多。 请问为什么在Java中使用iterator? 只是为了取代“for”循环? 谢谢。

一些说明:

  • 第二个迭代器应该从第一个迭代器的位置开始。
  • 我尝试从头开始查看有序列表,在列表中找到一些具有与aItr指向的类似属性的对象。

我不介意使用两个“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,我搜索了很多,但所有结果都使用迭代器来打印一些东西。 非常感谢您的帮助。

你不应该这样做:

 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()方法或类似的东西,我同意你的看法……

如果你想要列表中位置n的第二个列表迭代器,那么使用List#listIterator(int index) :

 ListIterator bIter = list.listIterator(n); 

由于您似乎在使用列表,因此在您的情况下最简单的解决方案是使用两个索引,如下所示:

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

使用迭代器,您可以实现类似的function,但您必须为内循环构造新的迭代器,可能来自

 aList.subList(i, aList.size()).iterator(); 

这是有效的,但它不会做你想做的事情。 你仍然只有一个迭代器,外部循环将在内部循环第一次终止后终止。

无法有意义地复制Java迭代器。 您将不得不使用一个简单的for循环来增加索引。

做这个:

 ArrayList aList = new ArrayList(); // do something to fill the list for (int i = 0; i < aList.size(); i++) { ArrayList bList = aList.subList(i, aList.size()); for (int j = 0; j < bList.size(); j++) { // do stuff with the sublist } } 

重要的是要注意bList由aList支持,因此对bList的更改将反映在aList中...进行非结构性更改只是为了保持理智。