Нужна помощь с использованием итератора - PullRequest
1 голос
/ 16 февраля 2011

Я совершенно новичок в итераторах. У меня есть ArrayList с именем «Test» с объектами String. Как мне использовать класс итераторов? Я перепробовал все, что мог придумать, просто это не имеет смысла. Спасибо за помощь.

Скажем, у меня есть итератор с именем "iter". Мне нужно пройти через мой ArrayList в поисках определенной строки. Когда эта строка найдена, мне нужно добавить ее в другой ArrayList с именем «test2».

while(iter.hasNext()) {
    if(iter.next() == sampleString) {
        test2.add(sampleString);
    }
}

Единственная проблема с этим заключается в том, что когда я вызываю next (), он перемещает указатель на следующую строку, игнорируя первую строку в ArrayList. Как бы это реализовать ??

Ответы [ 5 ]

4 голосов
/ 16 февраля 2011

Итераторы обычно используются следующим образом:

while (iter.hasNext()) {
    String nextString = iter.next();
    // Do something with the string...
}

Некоторые (включая меня) предпочтут расширенный цикл for:

for (String nextString : listOfStrings) {
    // Do something with the string
}

Цикл for устраняет необходимость в получении явногоСсылка на итератор и включает объявление переменной nextString, сохраняя ее краткой и правильной области видимости.

4 голосов
/ 16 февраля 2011

Вам не нужен.ArrayList уже итерируем!: -D

ArrayList<String> test = new ArrayList<String>();
test.add("Hello");
test.add("world");
for(String str : test) System.out.println(str);
2 голосов
/ 16 февраля 2011

Проблема в том, что вы не совсем на 100% понимаете, как работает Iterator.next ()

Это копируется непосредственно из Java API

E next () - Возвращает следующий элементв итерации.

Это означает, что .next () вернет объект, затем перейдет к следующему элементу в списке.

Вам необходимо сохранить возвращенный объект при вызове next ()

while(iter.hasNext()) 
{
    String temp = iter.next();
    //this is a more old school method but more true to form. 
    //== doesn't necessarily do equality checks on all objects the way
    //you would think 
    if(temp.equals(sampleString)) 
    {
        test2.add(temp);
    }
}
0 голосов
/ 16 февраля 2011

Итератор - это средство обхода коллекции элементов. Придерживаясь этого утверждения, java.util.Collection расширяет Iterable (public interface Collection<E> extends Iterable<E>). все классы коллекций итерируемые в в некотором роде . iterator () - метод для получения дескриптора этого Iterator . Когда у вас есть ручка, вы можете перемещаться по предметам.

Я как-то выделил, потому что не все Итераторы допускают двунаправленный обход. ListIterator позволяет это.

Я бы переписал твой код, как показано ниже

for(String s : myCollection)
{
   if(s.equals(sampleString))
   {
      test.add(s);
   }
}
0 голосов
/ 16 февраля 2011

Итератор - это просто то, что понимает, как обходить данную структуру данных.

Что вы не понимаете?

Для List итератор будет отслеживать свою текущую позицию в списке и понимать, как получить следующий элемент в списке.Для чего-то вроде списка это относительно просто, но вы также можете определить итератор для некоторой другой произвольной структуры данных, которая не так проста, как список.Вы также можете определить тот, который делает что-то по-другому, например, обход списка в обратном направлении.Если у вас есть конкретные вопросы об итераторах, обновите ваш вопрос, и мы попробуем: -)

...