2014-12-02 95 views
2

每個For循環與我用過的迭代器(使用Iterator.remove();方法)是這樣的:的Java:for循環和迭代

for (Iterator<E> iter = list.iterator(); iter.hasNext();) { 
    E element = iter.next(); 
    //some code 
} 

基本for循環風格:

for([initial statement]; [loop condition]; [iterating statement]) {/*Some Code*/} 

所以我的問題是...爲什麼他們從來沒有寫過

for (Iterator<E> iter = list.iterator(); iter.hasNext(); E element = iter.next()) { 
    //some code 
} 

回答

6

的迭代語句執行後的循環體已經執行。換句話說,當你寫了以下內容:

for (Iterator<E> iter = list.iterator(); iter.hasNext(); element = iter.next()) { 
    //some code 
} 

element = iter.next()將身體已經運行在每次迭代之後運行,所以如果你要打印的元素,例如,第一個元素是任何初始值element有。

實施例:

List<String> list = new ArrayList<String>(); 
list.add("a1"); 
list.add("a2"); 
list.add("a3"); 
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) { 
    String string = iterator.next(); 
    System.out.println(string); 
} 

輸出:

a1 
a2 
a3 

隨着iter.next()for循環:

List<String> list = new ArrayList<String>(); 
list.add("a1"); 
list.add("a2"); 
list.add("a3"); 
String string = null; 
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); string = iterator.next()) { 
    System.out.println(string); 
} 

輸出:

null 
a1 
a2 

P.S:環路爲你申報(for (Iterator<E> iter = list.iterator(); iter.hasNext(); E element = iter.next())將無法​​編譯,所以你需要聲明element因爲這行之前的變量。

6

for循環語法不允許您在「迭代語句」中聲明變量。

(你可以聲明一,在「初始聲明」,這是爲什麼for (Iterator<E> iter = list.iterator(); iter.hasNext();)是syntatically有效。)

-1

鑑於一個for循環是圍繞while環路只是語法糖,你不能使用「迭代語句」你所希望的方式,它可能是整潔使用直接在while循環:

Iterator<E> iter = list.iterator(); 
while (iter.hasNext()) { 
    E element = iter.next(); 
    //some code 
} 
+0

這是最大限度地減少局部變量的範圍。 – Puce 2014-12-02 13:17:45

+0

這比以前好,但仍然沒有最小化。在這種情況下,最小範圍是循環的範圍,如果你不需要循環之外的變量。 – Puce 2014-12-02 13:41:41

+0

@Puce我認爲可讀性比範圍界定中的「最佳實踐」規則更重要。看看這個問題,我會說這種方法是最常用的。 http://stackoverflow.com/a/1196612/360211 – weston 2014-12-02 14:05:35