2016-05-18 16 views
2
ArrayList<String> list = new ArrayList<String>(); 
list.add("test"); 

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

"test"で無限ループのループが生成されます。なぜこれが起こり、それを修正するのですか?Java - ListIteratorを使用した無限ループ.hasNext()

+3

各ループステップで新しいイテレータを生成しています。常に新しいもので、リストにアイテムが含まれています。「hasNext()」は常に「true」を返します。 – Valentin

+0

forループを使用すると、1行でこれを行うこともできます。for(ListIterator it = list.listIterator(); it.hasNext();){/ * looped code * /} 'は、イテレータはそのループだけになります。 – zapl

答えて

9

hasNextのために作成されたイテレータは、次のものと同じではありません。

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

list.listIterator()コールごとにイテレータの新しいインスタンスを作成します。

ループを開始して問題を解決する前に、リストイテレータを1回作成します。

0

あなたの呼び出しlistIterator毎回。変数に代入し、それをループしてみてください。

0

list.listIterator()新しいイテレータを返します。以下はAbstractList

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

の源であるあなたは、このようにループを作る必要があり、

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

あなたの問題は、各list.listIterator()コールで新しいイテレータを作成しているということです。新しいインスタンスはすべてイテレータの先頭にあります。ここで

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

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

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

:あなたは同じイテレータを使用する場合は、それを修正することができます

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

新しいイテレータあなたが次の要素をプリントアウトしようとするたびに作成します。

は、単に次のことを試してください。

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

list.add("test"); 

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

while(it.hasNext()) { 

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

} 
1

あなたは各ループに新しいイテレータを作成しているので、新しく作成されたイテレータポインタが最初の要素の前に配置され、

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()); 
} 
2

をこのコードを使用しますリスト内のその場合のhasNext()メソッドは常にtrueを返し、next()メソッドはリストの最初の要素を返します。

関連する問題