0

次の問題があります。「if」の最初の部分でイテレータを使用して S の要素を削除しますが、同じイテレータを使用して S からセット S3 全体を削除する方法についての手がかりがありません「それ以外」の部分。何か案は?前もって感謝します!

public void f(RewritingNode x, Set<RewritingNode>S0){
      Set<RewritingNode> S1 = new HashSet<RewritingNode>();
      Set<RewritingNode> S3 = new HashSet<RewritingNode>();
      S1.addAll(x.children);
      S0.addAll(S1);
      Set<RewritingNode> S = new HashSet<RewritingNode>();
      S.addAll(S1);

      while (!S.isEmpty()){
          for (Iterator<RewritingNode> iter_y= S.iterator(); iter_y.hasNext();) {
              RewritingNode y = iter_y.next();

              RewritingNode y = iter_y.next();

              if(S0.containsAll(y.parents)||y.parents.isEmpty()){
                 iter_y.remove();
              }
              else {
                  S3.add(y);                      
                  S.addAll(S1);             
                  S.removeAll(S3);
              } 
          }
    }

    Set<RewritingNode> removedChildren = new HashSet<RewritingNode>();
    removedChildren.addAll(S1);
    removedChildren.removeAll(S3);

    for(RewritingNode x1 :removedChildren){
        x1.parents.removeAll(x1.parents);
        f(x1,S0);
    }
}
4

2 に答える 2

2

削除するすべての要素を別のリストに入れるか、ループの終了後にそれらを設定して削除します。すべて削除する場合は、ブール値を設定し、whileループが終了した後にこれを繰り返します。または、すべての要素を要素の削除リストに追加し、whileループが終了した後にそれらを削除します。そうしないと、ある種の同時変更例外が発生します。

アップデート

ここで行っていることの代わりに、キューを使用してみてください。このようなキューLinkedListにはFIFOオーダーがあります。LinkedListにはremove()、最初の要素を返し、それを削除するメソッドがあります。これを使用して最初の要素をフェッチして比較します。保持する必要がある場合は、リストに再度追加すると、最後の要素になります。リストが空になるまでこれを続けてください、そしてそれはあなたのためにそれをするはずです。

これはコードよりもはるかに単純であり、イテレータや複数のセットは必要ありません。何らかの理由で、メソッドが要素を返すときに、削除された要素をセット(または保持したいイベント)に追加する必要がある場合は、必要remove()なセットに追加します。

于 2011-08-31T20:45:26.510 に答える
0

イテレータまたは拡張Forループの代わりに、インデックス付きの通常のForループを使用します。イテレータを実行している間は、removeAllを実行できないと思います。

于 2011-08-31T20:45:16.223 に答える