2013-06-25 24 views
-1

我正在經歷java增強for循環和迭代器之間的差異。關於Java增強for循環訪問索引的含義是什麼?

我從淨

的這個聲明下面for-each循環幾乎可以肯定是從Java 5中的最新流行的功能,它的工作原理,因爲它增加的抽象水平 - 而不必表達低如何在列表或數組中循環(使用索引或迭代器),開發人員只需說明他們想要循環,而語言則負責處理其餘部分。但是,只要開發人員需要訪問索引或移除項目,所有好處都會丟失。

我能不能夠理解這個下面一行

所有的好處是爲開發人員需要訪問索引

在增強的for循環,how is it possible to access the index一旦失去了什麼? ?

附加一個示例程序,它會更好,如果任何人都可以告訴我如何索引可以在這種情況下

package com; 

import java.util.ArrayList; 
import java.util.Iterator; 

public class Tester { 

    public static void main(String args[]) { 

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

     list.add("One"); 
     list.add("Two"); 
     list.add("Three"); 
     list.add("Four"); 
     list.add("Five"); 
     list.add("Six"); 
     list.add("Seven"); 

     StringBuffer sb = new StringBuffer(); 

     // From here I want to change if this can be tuned anyway 

     for (String result : list) { 

      if (result.equals("One") || result.equals("Two")) { 
       sb.append("1.0"); 
      } 

      if (result.equals("Three")) { 
       sb.append("3.0"); 
      } else { 
       sb.append("4.0"); 
      } 

     } 

     System.out.println(sb.toString()); 
    } 
} 
+1

如果索引是很重要的,不要使用foreach循環或者在每次通過循環時手動增加它。簡單。 – Patashu

+0

可能是英語中的一個更好的問題。 –

+0

*這就是*「開發人員需要訪問索引時所有好處都會丟失」* - 如果您需要知道循環中的索引,那麼'foreach'循環的所有好處都是無關緊要的,因爲你需要自己執行一個標準的'for-next'循環 – MadProgrammer

回答

2

在增強的for循環來訪問,怎麼可能訪問索引??

也許你不能明確地做。但是你可以初始化一個剛剛在循環之上的局部變量,並在循環體內增加它。這樣它可以成爲索引的代理。

在JSTL的forEach循環中,您可以擁有索引的句柄,而不是Java的增強for循環。如果您需要使用索引,最好使用正統的for循環。

這個循環:

for(int i=0;i<list.size();i++) { String str = list.get(i); } 

可以簡化爲這個

for(String str:list) {} 

甚至這個

int count = 0; 
for(String str : list) { 
// your code 
count++; 
} 
2

在這是不可能訪問索引for-each循環,你將不得不維護一個計數器。

注意某些集合不是隨機訪問,意味着您無論如何都不能使用索引。

1

for-each循環中,不可能找到當前項目的索引(對於列表沒有.indexOf(),或者明確跟蹤它)。據我所知,所有這些都是說如果你需要訪問索引,那麼你不應該使用for-each循環。

for-each循環的目的是抽象出索引的思想,並只關注你想要做的核心 - 迭代該事物。如果您使用for-each循環,這是否通過索引或其他方式無關緊要。

1

使用計數器變量(在這種情況下,最好使用正常的for循環),或使用ArrayList中的成員函數indexOf

你最好的選擇是使用一個普通的for循環,因爲我相信indexOf比爲當前索引保留一個計數器變量要昂貴得多。

1

其實,你可以使用增強的for循環之外定義一個局部變量計算循環的時間運行

像:

int count = 0; 
Array <Integer> int_array = new ArrayList<Integer>() 
int_array.add(1); 
int_array.add(2); 
int_array.add(3); 

for (Integer int_element : int_array) 
{ 
    //some functionality codes here 
    // ... 

    //update the count 
    count ++; 
}