2012-12-03 30 views
27

LinkedListイテレータを最初の要素に「リセット」する方法を知る必要があります。例えばjava- resetリストの最初の要素にイテレータをリストします

LinkedList<String> list;

Iterator iter=list.listIterator;

iter.next();

iter.next();

何度も何度も、私は位置を "リセット" する必要がイテレータの多く移動した後、イテレータの `

私は私がこのように最初の要素のリスト反復子を得ることができることを知っている私は、最初の要素に私のイテレータを「リセット」することができますどのように

を聞きたい:

iter= list.listIterator(1);

これが最善の解決策ですか?または私はOracleのドキュメントで何かを逃した?

+0

なぜ新しいイテレータを作成しないのですか? – reprogrammer

+1

あなたが何かを見逃してしまったことがあります。もしあなたが次より多かれ少なかろうとする必要があるならば、イテレータは最良の選択ではありません。なぜあなたはリセットする必要がありますか? –

+0

私はJavaの動的リストのアイデアを理解しようとしています。数週間前にjsp oageのセッション変数に問題があります。 ELとtaglibsからイテレータのメソッドを使うことはできますが、私はそれを再定義できません(まだjspについての知識はまだありますが、それでも改善しています:)) "イテレータは最良の選択ではありません"あなたは私にそれを説明できますか? :) – ognistysztorm

答えて

16

ベスト通常、それはあらゆる分野でより遅く、あまり便利で、全くLinkedListを使用していないことになります。使用ArrayList

を(主に特に高速であるLinkedListの大きなアレイに対して、正面に削除/挿入するとき)、及び

int len = list.size(); 
for (int i = 0; i < len; i++) { 
    Element ele = list.get(i); 
} 

リセットして反復すること再度、単にループ自明です。
イテレータを使う、という場合は、新しいイテレータを使用する必要があります。

iter = list.listIterator(); 

(私は一度だけ、私の生活の中でのLinkedListの利点を見た:私は、whileループwhithループを通過する可能性があり、削除最初の要素)

+4

主にフロントに削除して挿入すると、LinkedListの方が高速です。 – raceworm

+0

LinkedListの場合でも、中央からアイテムを削除することさえ早いです。つまり、iterator.remove()を使用して項目を繰り返し処理したり削除したりしている場合です。 ArrayListは、残りの項目のシフトを必要とします。 – Sohaib

+0

@Sohaib、はい、主にそれはリストのサイズによって異なります。特定の数のエレメントSystem.arraycopyは、内部でC - memcopyを使用します。これは、配列のシフトに使用されます。高度な実装では、要素のサイズに依存しない基本実装を切り替えます。 – AlexWien

34

あなたがリストの先頭に指すイテレータのインスタンスを取得するために、再度listIteratorメソッドを呼び出すことができます。

iter = list.listIterator(); 
+3

素晴らしい。この呼び出しがすでに使用しているイテレータと同じ参照を返すだけではないことはすぐにはわかりません。しかし、私はソースを調べると、その答えも解決したと思います。好奇心をそそる人のためのリンクがあります。これは私がより良くしようとしている習慣です:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/ util/ArrayList.java#ArrayList.listIterator%28%29 – anon58192932

4

順序は重要ではない場合、我々は再び反復をすることができます後方を同じイテレータでhasPrevious()previous()方法を使用して:

ListIterator<T> lit = myList.listIterator(); // create just one iterator 

最初のイテレータは、我々が前進繰り返しを行い、最初に座っている:

while (lit.hasNext()) process(lit.next()); // begin -> end 

イテレータが最後に座っているし、我々は後方の繰り返し行うことができます。

while (lit.hasPrevious()) process2(lit.previous()); // end -> begin 
4

これがあると代わりの解決法ですが、価値あるものにするために十分な価値があると主張できます:

import com.google.common.collect.Iterables; 
... 
Iterator<String> iter = Iterables.cycle(list).iterator(); 
if(iter.hasNext()) { 
    str = iter.next(); 
} 

hasNext()を呼び出すと、イテレータのカーソルが先頭に戻ってきます。

関連する問題