2015-12-14 2 views
2

У меня были проблемы со всей идеей итератора и вопросом в одном из моих викторин, я, честно говоря, не мог понять, что было.Iterator Confused

public static void main(String[] args) 
{ 
    Deque<String> SQ1 = new ArrayDeque<String>(); 

    SQ1.add("Give"); 
    SQ1.add("Me"); 
    SQ1.add("The"); 
    SQ1.add("Best"); 
    SQ1.add("Of"); 
    SQ1.add("Both"); 
    SQ1.add("Worlds"); 
    Iterator<String> It = SQ1.iterator(); 

    while(It.hasNext()) 
    { 
     if(It.next().equals("Give")) 
      System.out.print(It.next()); 
    } 
} 

Это код, и вопрос в том, какой будет выход. Правильный ответ "Me", когда я думал, что это "Give". Я не понимаю, как проходит весь пробег.

Это то, что я понимаю: У этого есть next. Если это next равно "Give", он распечатает это значение next. В этом случае это значение должно быть «Дать», не так ли?

Может кто-нибудь, пожалуйста, помогите мне понять это?

+0

Внутри 'if' он называет' Next() равно (. «Дать») ', который ловит его, когда он выполняет итерацию' 'Дать «'. Затем при печати он снова вызывает 'next()', который выполняет итерацию на '' Me ''. – Tricky12

+0

Спасибо! Это была одна из теорий, которые у меня были, но я думал, что это не имеет смысла. Спасибо, что освободили меня. – user5666676

+0

'Возвращает следующий элемент в итерации.' - https://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html – Tricky12

ответ

3

Условные-оператор называет It.next() для проверки значения, и оператор печати вызывает It.next()снова, а не печать значения, которое вы только что проверили.

Так что вы увидите, всегда будет элемент непосредственно после"Give".

1

Как вы можете видеть из документации Java:

Следующая

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

Возвращает: следующий элемент в итерационном

Броски: NoSuchElementException - если итерация не имеет больше элементов

Так ваш звонок:

If(It.next().equals("Give")) 

На самом деле возвращает " next "и устанавливает Iterator 'It' для следующего в вашем ArrayDeque. Если вы позвоните в следующий раз, вы будете на один шаг дальше.

2

Правильный ответ «Я», когда я думал, что это «Дай». Я не понимаю, как проходит весь пробег.

Правильно, код иллюстрирует общую ошибку. Ошибка в том, что код говорит итератор, чтобы перейти к следующему пункту и дайте нам дважды:

Iterator<String> It = SQ1.iterator(); 
while(It.hasNext()) 
{ 
    if(It.next().equals("Give")) 
// here^^^^^^^^^ 
     System.out.print(It.next()); 
// and here -------------^^^^^^^^^ 
} 

Так это становится значение, видя, если это "Give", а затем, если это значение было "Give" он отбрасывает его и получает значение следующее значение, которое в ваших тестовых данных "Me". (Обратите внимание, что , если"Give" были последней записью, второй звонок next произведет ошибку, так как в этой точке не будет следующей записи.)

Чтобы «исправить» это и есть его показать "Give", до сих пор с помощью такой петли, вы помните, результат вызова в переменной, а затем использовать переменную в этих двух местах:

Iterator<String> It = SQ1.iterator(); 
while(It.hasNext()) 
{ 
    String value = It.next(); 

    if(value.equals("Give")) 
     System.out.print(value); 
} 

Но, это то, что расширенная for петля для: Вы не используете It переменную на всех, просто:

for (String value : SQ1) { 
    if(value.equals("Give")) 
     System.out.print(value); 
} 
+0

Спасибо, ты полностью ответил на мой следующий вопрос. Отличное объяснение еще раз спасибо! – user5666676

+0

@MiguelValdez: Рад, что помогло! Если этот * ответ * * ваш вопрос, как работает переполнение стека, вы должны «принять» ответ, нажав галочку рядом с ним; [подробнее здесь] (/ help/someone-answers), который снимает с него список оставшихся без ответа вопросов. –