Как использовать итератор в цикле if -else с RemoveAll в Java? - PullRequest
0 голосов
/ 01 сентября 2011

У меня есть следующая проблема: я использую итератор в первой части «если», чтобы удалить элемент S, но я понятия не имею, как удалить весь набор S3 из 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);
    }
}

Ответы [ 2 ]

2 голосов
/ 01 сентября 2011

Поместите все элементы, которые вы хотите удалить, в отдельный список или установите и удалите их после завершения цикла.В случае удаления всего, установите логическое значение и снова сделайте это после окончания цикла while.Или просто добавьте все элементы в список удаления элементов и удалите их после завершения цикла while, в противном случае вы получите какое-то исключение одновременного изменения.

Обновление

Попробуйте использовать очередь вместо того, что вы делаете здесь.Очередь типа LinkedList, в которой есть заказ FIFO.LinkedList имеет метод remove(), который возвращает первый элемент и удаляет его.Используйте его, чтобы получить первый элемент и сравнить его. Если вам нужно сохранить его, добавьте его в список еще раз, и он станет последним элементом.продолжайте делать это до тех пор, пока список не станет пустым, и это должно сделать это для вас.

Это должно быть намного проще, чем ваш код, и вам не нужны итераторы или множественные множества.Если по какой-либо причине вам нужно добавить удаленные элементы в набор (или событие, которое вы хотите сохранить), когда метод remove() возвращает элемент, добавьте его в любой набор, который вы хотите.

0 голосов
/ 01 сентября 2011

Использование обычного цикла For с индексом вместо итератора или расширенного цикла For, я думаю, что вы не можете сделать removeAll при прохождении через итератор

...