2

イテレータについて簡単な質問があります。

現在、2つのオブジェクトリストから重複しているアイテムを削除したいと思います。

私が今設定している方法は、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

を呼び出した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

したがって、コードは機能します(もちろん、試してみるだけで発見できます)

于 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 に答える