java - 迭代器 hasNext 意味着列表永远不会为空

标签 java iterator

我只是有一个关于迭代器的简单问题。

我当前想要从两个对象列表中删除重复的项目。

我现在设置的方式是,只要第二个列表(需要从第一个列表中删除的对象列表)有项目,进行合并的循环就会继续运行。

我一直在使用 hasNext() 函数来检查是否仍有项目,但我认为这可能有一个小问题。

当迭代器指向列表中的最后一项并调用 hasNext() 时,它将返回 false,因为最后一项之后没有任何内容。这意味着该项目不会从第一个列表中删除。这是真的吗?

代码如下:

for (Iterator<Card> discardItr = discard.iterator(); discardItr.hasNext();)
{
    Card tempDiscard = discardItr.next();

    Iterator<Card> mixedItr = mixedHand.iterator();
    while (mixedItr.hasNext())
    {
        if (tempDiscard.equals(mixedItr.next()))
        {
            discardItr.remove();
            mixedItr.remove();
        }
    }

}

最佳答案

即使您调用 iterator#removeIterator 也会循环遍历整个列表。例如运行

public class IteratorDemo {
  public static void main( String[] args ) {
    List<String> list = new ArrayList<>(  );
    list.addAll( Arrays.asList("first", "second", "third" ) );
    Iterator<String> iterator = list.iterator();
    while ( iterator.hasNext() ) {
      String next = iterator.next();
      System.out.println(next);
      iterator.remove();
    }
  }
}

产生以下输出

first
second
third

这样你的代码就可以工作了(当然你只要尝试一下就会发现)

关于java - 迭代器 hasNext 意味着列表永远不会为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13094134/

相关文章:

c++ - 如何在运行时选择迭代器方向

c++ - 有序映射的迭代器有效性

C++ 双端队列 : when iterators are invalidated

python - 如何使用zscan以相反的顺序遍历Redis中的排序集?

java - 视频连续播放 firebase

java - 渐变 : not installed (cordova requirements)

java - Java 类加载器的目的是什么?

c++ - C++ 中的迭代器

java - 如何在 Mockito 中测试简单的 set 方法?

java - 当我按下连续按钮时,为什么它不连续运行?