2

我只是有一个关于迭代器的快速问题。

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

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

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

}
4

2 回答 2

2

AnIterator将遍历整个列表,即使您调用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

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

于 2012-10-26T21:08:36.177 回答
0

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

Set<Card> discardCopy = new HashSet<Card>(discard);
Set<Card> mixedCopy = new HashSet<Card>(mixedHand);
mixedHand.removeAll(discardCopy);
discard.removeAll(mixedCopy);
于 2012-10-26T20:52:22.900 回答