Iterator hasNext表示列表永远不会为空

时间:2012-10-26 20:41:10

标签: 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();
        }
    }

}

2 个答案:

答案 0 :(得分:2)

即使您拨打Iteratoriterator#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

所以你的代码会起作用(你当然可以通过尝试来发现它)

答案 1 :(得分:0)

如果您的数据集很小,并且您可以使用Set而不是List,则可以使用以下代码,这样更简单,更清晰,但需要更多内存:

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