Итерация коллекции более одного раза - PullRequest
2 голосов
/ 13 декабря 2011

У меня проблемы с использованием Iterator в Java.

it=myHash.iterator();
 while (it.hasNext()) 
        if (it.next() satisfying something) 
            do something

 while (it.hasNext()) 
        if (it.next() satisfying something) 
            it.remove();

Я пытаюсь повторить хэш-набор дважды, и первый цикл заставляет it.hasNext() вернуть false.Как мне решить эту проблему?

Я пытался даже добавить редактирование, как вы, ребята, предложили, все еще не работает ...

Ответы [ 2 ]

3 голосов
/ 13 декабря 2011

Вы повторно используете тот же итератор - и он был недействителен, добавляя новые элементы в набор.

Вы должны позвонить iterator() снова на съемочной площадке:

it = set.iterator();

Вы не можете сбросить существующий итератор

РЕДАКТИРОВАТЬ: Вот пример кода, который показывает эту работу:

import java.util.*;

public class Test {
    public static void main(String[] args) {
        Set<String> set = new HashSet<String>();

        set.add("food");
        set.add("bad");
        set.add("hungry");
        set.add("neighbour");

        Iterator<String> it = set.iterator();

        // Remove any string longer than 4
        while (it.hasNext())
        {
            if (it.next().length() > 4)
            {
                it.remove();
            }
        }

        set.add("new long text");
        set.add("x");

        // Remove any string shorter than 4
        it = set.iterator();

        while (it.hasNext())
        {
            if (it.next().length() < 4)
            {
                it.remove();
            }
        }

        // Dump the results
        for (String x : set)
        {
            System.out.println(x);
        }
    }
}

Это дает результаты "новый длинный текст" и "еда".

1 голос
/ 13 декабря 2011

В идеале, то, что вы ищете, это операция сброса на итераторе.Итераторы предназначены для однонаправленного и одноразового использования, так как они не поддерживают сброс в Java.

Вы можете получить новый экземпляр итератора или использовать ListIterator интерфейс, который позволяет вам смотреть назад, используя previous ().

Edit:

Вы используете remove () на итераторе, который также удаляет элементы из исходного набора.В таком случае вам следует подумать о создании копии набора, так как вы хотите перебирать элементы заново:

import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;

public class IteratorSnippet {
   public static void main(String[] args) {

      final HashSet<Integer> myHash = new HashSet<Integer>();
      myHash.addAll(Arrays.asList(1, 2, 3, 4, 5));

      // make copy before using iterator with remove
      final HashSet<Integer> myHash2 = new HashSet<Integer>(myHash);

      Iterator<Integer> it = myHash.iterator();
      System.out.println("First go...");
      while (it.hasNext()) {
         System.out.println(it.next());
         it.remove();
      }

      it = myHash2.iterator();
      System.out.println("Second go...");
      while (it.hasNext()) {
         System.out.println(it.next());
      }

   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...