2012-12-03 50 views
27

我需要知道如何「重置」LinkedList迭代器到它的第一個元素。java-重置列表迭代器到列表的第一個元素

例如:

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可言,通常它是在所有學科慢,少得心應手。 (當主要插入/刪除了前面,特別是對於大陣列LinkedList的是更快)

使用ArrayList,並與

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

復位迭代又是微不足道的,只是循環。
如果你堅持使用迭代器,那麼你必須使用一個新的迭代:

iter = list.listIterator(); 

(我在我的生活的LinkedList的優勢,看到的只是一次:我可以通過蒙山while循環,並消除環路第一個元素)

+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 – 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()會將迭代器光標重置爲開始位置,如果它結束。

相關問題