0

我有以下问题:我确实在“if”的第一部分使用迭代器来删除 S 的一个元素,但我不知道如何在“其他”部分。有任何想法吗?先感谢您!

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 回答