如何使用if -else循环中的迭代器和java中的removeAll?

时间:2011-08-31 20:38:10

标签: java iterator removeall

我有以下问题:我在“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);
    }
}

2 个答案:

答案 0 :(得分:2)

将要删除的所有元素放在单独的列表中,或者在循环结束后设置并删除它们。在全部删除的情况下,设置一个布尔值,然后再次在while循环结束后执行此操作。或者只是将所有元素添加到删除元素列表中,并在while循环结束后删除它们,否则您将获得某种并发修改异常。

<强>更新

尝试使用队列而不是你在这里做的任何事情。像LinkedList这样的队列,具有FIFO顺序。 LinkedList有一个remove()方法,它返回第一个元素并将其删除。使用它来获取第一个元素并进行比较,如果你需要保留它,再次将它添加到列表中它将成为最后一个元素。继续这样做直到列表为空,这应该为你做。

这应该比您的代码简单得多,不需要迭代器或多个集合。如果出于某种原因,当remove()方法返回元素时,您需要将已删除的元素添加到集合(或者您要保留的事件),将其添加到您想要的任何集合中。

答案 1 :(得分:0)

使用带索引的普通For循环而不是迭代器或增强的For循环,我认为你在通过迭代器时不能执行removeAll