Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在一个ArrayList中使用两个迭代器_Java_Iterator - Fatal编程技术网

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

Java 在一个ArrayList中使用两个迭代器,java,iterator,Java,Iterator,编辑:感谢您的及时回复。现在我明白了,作业不起作用了。从另一个线程中,我读到java中的迭代器比C++中的迭代器要强大得多。我可以问一下为什么在Java中使用迭代器吗?只是为了替换“for”循环?谢谢 一些注意事项: 第二个迭代器应该从第一个迭代器之前的位置开始 我试着从一开始就遍历一个有序的列表,从列表中找到一些与aItr所指出的属性相似的对象 我不介意使用两个“for”循环,但我知道Java对所有这些库都非常强大。我只是好奇是否有比两个“for”循环更好的方法。谢谢 嗨 我一直使用C++

编辑:感谢您的及时回复。现在我明白了,作业不起作用了。从另一个线程中,我读到java中的迭代器比C++中的迭代器要强大得多。我可以问一下为什么在Java中使用迭代器吗?只是为了替换“for”循环?谢谢

一些注意事项:

  • 第二个迭代器应该从第一个迭代器之前的位置开始
  • 我试着从一开始就遍历一个有序的列表,从列表中找到一些与aItr所指出的属性相似的对象
我不介意使用两个“for”循环,但我知道Java对所有这些库都非常强大。我只是好奇是否有比两个“for”循环更好的方法。谢谢

我一直使用C++,但是我对java是新手,所以请耐心等待。我尝试使用两个迭代器循环遍历ArrayList。第一个迭代器遍历列表,第二个迭代器从第一个迭代器指向的位置开始,一直到列表的末尾。下面的代码是我想要做的(尽管可能无效):

将一个迭代器分配给另一个迭代器是否有效?如果没有,那么做我想做的事情的最佳方式是什么?多谢各位

<>我知道它在C++中是有效的,但对java不太确定,而且我搜索了很多,但是所有的结果都使用迭代器来打印一些东西。非常感谢您的帮助。

您不应该这样做:

Iterator bIter = aIter;
因为Java中没有复制构造函数等;比特将是对同一底层迭代器的引用

可以通过以下方式使用ListIterator:

ListIterator aItr = aList.listIterator();
while (aItr.hasNext()) {
 int a = aItr.next();
 ListIterator bItr = aList.listIterator(aItr.previousIndex());
 while (bItr.hasNext()) {
   // ...
 }
}

但是,如果您认为ListIterator应该有一个copy()方法或类似的方法,我同意您的看法…

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

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

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


Java迭代器不能被有意义地复制。您必须使用一个简单的for循环来增加索引。

如果您想在列表中的位置n处使用第二个列表迭代器,请使用:

这样做:

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
  }
}
ArrayList aList=new ArrayList();
//做点什么来填这个清单
对于(int i=0;i

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

谢谢!你是对的。我没有在Java中找到迭代器的复制构造函数。这就是为什么我感到困惑,因为它限制了迭代器的使用。那么在Java中,人们使用迭代器只是为了替换for循环吗?我可以用两个for循环来得到我想要的吗?谢谢。在Java中,当您不想了解底层集合实现时,可以使用迭代器。在Java5以后的版本中,迭代器的使用较少(显式),因为for-each构造下面使用Iterable和迭代器。在Java5中,迭代器主要用于迭代和有条件地删除元素。谢谢。如果我想bItr指向下一个对象,我想应该使用nextIndex()。这会导致任何超出范围的问题吗?在使用nextIndex之前需要检查吗?谢谢。不幸的是,如果在第二次调用bItr.remove()时,您将得到ConcurrentModificationException,在我的情况下,这是非常令人伤心的。在创建之后,第二个迭代器应该指向哪里?在第一个位置还是在第一个点位置之后?正如下面所提到的,这并不是您希望它做的。也许你可以分享你想要完成的事情,以便找到更好的方法?谢谢。我编辑这篇文章来描述我真正想做的事情。谢谢!请问如何从第一个迭代器中得到“n”(索引)?如果它是C++,我可以使用“AsiaTrist.Nosig()”。这是我在Java中可以做到的吗?请看这个Javadoc for ListIterator:有两个方法nextIndex()和previousIndex(),它们将为您提供第一个ListIterator的索引。
aList.subList(i, aList.size()).iterator();
ListIterator bIter = list.listIterator(n);
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
  }
}