【问题标题】:Iterator hasNext means list is never empty迭代器 hasNext 意味着列表永远不会为空
【发布时间】:2012-10-26 20:41:10
【问题描述】:

我有一个关于迭代器的小问题。

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

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

我一直在使用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();
        }
    }

}

【问题讨论】:

  • hasNext() 为真当且仅当对next() 的后续调用将成功。
  • 这是否意味着即使这个列表中还剩下一项,它也会返回true?例如。 [1,2,3] 即使在最后一项 3 处它也会返回 true 吗?
  • 你觉得呢,next()会给你最后一个元素吗?

标签: java iterator


【解决方案1】:

Iterator 将遍历整个列表,即使您调用 iterator#remove。例如运行

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

所以你的代码可以工作(你当然会通过尝试发现)

【讨论】:

    【解决方案2】:

    如果你的数据集比较小,你可以用Set代替List,你可以使用下面的代码,这样更简单更干净,但是需要更多的内存:

    Set<Card> discardCopy = new HashSet<Card>(discard);
    Set<Card> mixedCopy = new HashSet<Card>(mixedHand);
    mixedHand.removeAll(discardCopy);
    discard.removeAll(mixedCopy);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多