2014年5月18日 星期日

心得筆記-java 的加強版 for 迴圈 (for each迴圈)

java 的 for 迴圈出現一種以前從沒有看過的格式。它是JAVA 5.0 後多的一種 for 迴圈寫法,目的是簡化陣列與集合物件的元素存取方式.
在JDK 5.0版新增加強型的for迴圈,其功能類似其他程式語言的foreach迴圈,可以輕鬆走訪陣列或集合物件的元素。

for-each 迴圈語法

for (型別 變數 : 集合或陣列物件參考或函式呼叫) {迴圈內程序}

冒號前面稱為宣告式, 後面稱為運算式. 宣告式的變數型別必須與陣列或集合的元素相容, 此變數將用在迴圈內部以便存取元素. 運算式可以是集合或陣列物件參考, 也可以是函式呼叫 (傳回陣列或集合).


舉例:

* for迴圈新舊寫法的對照
public class NewFor {
public static void main(String[] args) {

String [] a = {"1","3","5","7","9","11"};

//5.0前的for迴圈寫法
for(int i = 0 ; i < a.length ; i++){
String temp = a[i];
System.out.print(temp + ", ");
}

System.out.println();

//5.0後for迴圈也可以用這種新的寫法(for-each)
for(String temp : a){
System.out.print(temp + ", ");
}


* 用字串變數name配合加強型的for迴圈(for-each)來走訪names[]陣列

String[] names;
for ( String name: names )
{

System.out.print('\"'+name+"\"(字串長度:");
System.out.println(name.length() + ")");

}

可以看到程式碼比傳統用法更簡潔



* 用for 迴圈印出二維陣列之元素
int[][] a={{1,2},{3,4,5}, {6,7,8,9}};
for (int[] i : a) {
System.out.print(i.length);} //印出二維陣列的元素個數 2 3 4 (a[0]有二個元素{1,2}, a[1]有三個元素{3,4,5}, a[2]有四個元素{6,7,8,9})

for (int i : a[2]) {System.out.print(i);} //印出二維陣列第三個元素的內容6 7 8 9



* 以上範例均以陣列為例,如果用在集合物件的寫法
for (ScoreDoc scoreDoc : hits.scoreDocs) {
Document doc = searcher.doc(scoreDoc.doc);
System.out.println(doc.get("fullpath"));
}

這是我練習java時所寫的一個例中,hit.scoreDocs 為一集合物件,內含不定個數的物件,scoreDoc每次迴圈執行時,均會取得其中一個物件,for 迴圈遍歷結束後,便會把hit.scoreDocs內所有物件,指定給Document 型別的物件 doc , 並印出該文件的路徑。

如果用傳統寫法,應該是以下的樣子:
ScoreDoc scoreDoc;
for (int i=0;i<hits.scoreDocs.length;i++){
scoreDoc=hits.scoreDocs[i];
Document doc = searcher.doc(scoreDoc.doc);
System.out.println(doc.get("fullpath"));
}

參考:
http://tony1966.myweb.hinet.net/java/core/flow_control.htm

http://www.ibm.com/developerworks/library/j-forin/index.html


補充:
很多程式語言都有支援for-each這類的語法,簡單的說for-each語法就是當我們想要存取一個 Array 或 Collection 裡面所有的元時可以更方便、更有效率的語法。for-each 也有人稱為 enhanced for 或 for-in。

使用上要注意的事項有:

只適用於 Java 5.0 以後的版本
只適用於有 implement Iterable 的類別基本上 Array 與 Collection 類別都沒問題。
只能存取裡面元素而不能置換掉它,記住,for-each 裡面的變數是 local 變數離開 for-each 之後就會消失。
只能同時針對一個 Array 或 Collection 進行操作。
只能同時針對一個元素操作。
只能從頭開始訪問每個元素。

以上取自:
http://yindingtsai.blogspot.tw/2010/03/java-for-each-for-eachfor-each-array.html