как hasnext () работает в коллекции в Java - PullRequest
4 голосов
/ 03 сентября 2010

Программа:

public class SortedSet1 {

  public static void main(String[] args) {  

    List ac= new ArrayList();

    c.add(ac);
    ac.add(0,"hai");
    ac.add(1,"hw");
    ac.add(2,"ai"); 
    ac.add(3,"hi"); 
    ac.add("hai");

    Collections.sort(ac);

    Iterator it=ac.iterator();

    k=0;

    while(it.hasNext()) {    
      System.out.println(""+ac.get(k));
      k++;     
    }
  }
}

Выход: искусственный интеллект хаи Привет HW хаи

как это выполнить 5 раз ?? в то время как пришел в Хай, нет следующего элемента, присутствующего, так что условие ложно. Но как это выполняется.

Ответы [ 3 ]

16 голосов
/ 03 сентября 2010

Ваш цикл выше перебирает список с использованием индекса. it.hasNext() возвращает true, пока it не достигнет конца списка. Поскольку вы не вызываете it.next() в вашем цикле для продвижения итератора, it.hasNext() продолжает возвращать true, и ваш цикл запускается. До тех пор, пока k не станет равным 5, в этот момент выдается IndexOutOfBoundsException, который выходит из цикла.

Правильная идиома с использованием итератора будет

while(it.hasNext()){
    System.out.println(it.next());
}

или с использованием индекса

for(int k=0; k<ac.size(); k++) {
  System.out.println(ac.get(k));
}

Однако, начиная с Java5, предпочтительным способом является использование цикла foreach generics ):

List<String> ac= new ArrayList<String>();
...
for(String elem : ac){
    System.out.println(elem);
}
2 голосов
/ 03 сентября 2010

дело в том, что ac.get (k) не использует ни одного элемента итератора, в отличие от него .next ()

0 голосов
/ 03 сентября 2010

Этот цикл никогда не прекратится. it.hasNext не продвигает итератор. Вы должны вызвать it.next () для его продвижения. Цикл, вероятно, завершается, потому что k становится равным 5, и в этот момент Arraylist с исключением исключения a bounds.

Правильная форма итерации списка (содержащего строки):

Iterator it = ac.iterator();
while (it.hasNext) {
  System.out.println((String) it.next());
}

Или, если список напечатан, например, ArrayList

for (String s : ac) {
  System.out.println((String) s);
}

Или, если вы абсолютно точно знаете, что это список массивов и вам нужна скорость, а не краткость:

for (int i = 0; i < ac.size(); i++) {
  System.out.println(ac.get(i));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...