/ / Java - Nekonečná slučka so ListIterator .hasNext () - java, arraylist, nekonečná slučka, listiterator

Java - nekonečná slučka s ListIterator .hasNext () - java, arraylist, nekonečná slučka, listiterator

ArrayList<String> list = new ArrayList<String>();
list.add("test");

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

Takto sa vytvorí nekonečná slučka vedení s „testom“. Prečo sa to stalo a ako to opraviť?

odpovede:

9 pre odpoveď č. 1

Iterátor vytvorený pre hasNext nie je rovnaký ako pre nasledujúci.

ArrayList<String> list = new ArrayList<String>();
list.add("test");
Iterator listIterator = list.listIterator()
while(listIterator.hasNext()) {
System.out.println(listIterator.next());
}

3 pre odpoveď č. 2

Pretože vytvárate nový iterátor v každej slučke, novo vytvorený ukazovateľ iterátora sa umiestni pred prvý prvok v zozname. hasNext() metóda v takom prípade sa vždy vráti pravdivá a next() metóda vráti prvý prvok v zozname.


1 pre odpoveď č. 3

Tu:

System.out.println(list.listIterator().next());

pri každom pokuse o vytlačenie nasledujúceho prvku vytvoríte nový iterátor.

Skúste nasledujúce:

ArrayList<String> list = new ArrayList<String>();

list.add("test");

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

while(it.hasNext()) {

System.out.println(it.next());

}

1 pre odpoveď č. 4

Použite tento kód,

List<String> list = new ArrayList<String>();
ListIterator<String> litr = null;
list.add("test");
litr=list.listIterator();
System.out.println("Elements in forward directiton");
while(litr.hasNext()){
System.out.println(litr.next());
}

0 pre odpoveď č. 5

V každej vytvoríte novú inštanciu iterátora list.listIterator() zavolať.

Vytvorte iterátor zoznamu raz, skôr ako slučka začne riešiť váš problém.


0 pre odpoveď č. 6

Vaše volanie listIterator vždy. Skúste priradiť premennú a zacyklite ju.


0 pre odpoveď č. 7

list.listIterator() vracia nový Iterátor. Nižšie je uvedený zdroj AbstractList

  public ListIterator<E> listIterator() {
return listIterator(0);
}
public ListIterator<E> listIterator(int location) {
return new FullListIterator(location);
}

Mali by ste urobiť slučku takto,

ArrayList<String> list = new ArrayList<String>();
list.add("test");
Iterator<String> iterator = list.listIterator();
while(iterator .hasNext()) {
System.out.println(iterator.next());
}

0 pre odpoveď č. 8

Váš problém je v tom, že pri každom vytvárate nový iterátor list.listIterator() hovor. Všetky nové inštancie budú na začiatku iterátora. Môžete to opraviť, ak používate rovnaký iterátor:

    ArrayList<String> list = new ArrayList<String>();
list.add("test");

Iterator<String> iterator = list.listIterator();

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