迭代陣列
你可以使用增強型 for 迴圈(也稱為 foreach)或使用陣列索引來迭代陣列:
int[] array = new int[10];
// using indices: read and write
for (int i = 0; i < array.length; i++) {
array[i] = i;
}
Version >= Java SE 5
// extended for: read only
for (int e : array) {
System.out.println(e);
}
值得注意的是,沒有直接的方法在陣列上使用 Iterator,但是通過 Arrays 庫可以很容易地將其轉換為列表以獲取 Iterable
物件。
對於盒裝陣列,使用 Arrays.asList :
Integer[] boxed = {1, 2, 3};
Iterable<Integer> boxedIt = Arrays.asList(boxed); // list-backed iterable
Iterator<Integer> fromBoxed1 = boxedIt.iterator();
對於基本陣列(用 java 8)使用流(特別是在該實施例中 - Arrays.stream - > IntStream ):
int[] primitives = {1, 2, 3};
IntStream primitiveStream = Arrays.stream(primitives); // list-backed iterable
PrimitiveIterator.OfInt fromPrimitive1 = primitiveStream.iterator();
如果你不能使用流(沒有 java 8),你可以選擇使用 google 的 guava 庫:
Iterable<Integer> fromPrimitive2 = Ints.asList(primitives);
在二維陣列或更多陣列中,兩種技術都可以以稍微複雜的方式使用。
例:
int[][] array = new int[10][10];
for (int indexOuter = 0; indexOuter < array.length; indexOuter++) {
for (int indexInner = 0; indexInner < array[indexOuter].length; indexInner++) {
array[indexOuter][indexInner] = indexOuter + indexInner;
}
}
Version >= Java SE 5
for (int[] numbers : array) {
for (int value : numbers) {
System.out.println(value);
}
}
如果不使用基於索引的迴圈,則無法將 Array 設定為任何非均勻值。
當然,在使用索引進行迭代時,你也可以使用 while
或 do-while
迴圈。
需要注意的一點是: 使用陣列索引時,請確保索引介於 0
和 array.length - 1
之間(包括兩者)。不要對陣列長度進行硬編碼假設,否則如果陣列長度發生變化但你的硬編碼值不會改變,則可能會破壞程式碼。
例:
int[] numbers = {1, 2, 3, 4};
public void incrementNumbers() {
// DO THIS :
for (int i = 0; i < numbers.length; i++) {
numbers[i] += 1; //or this: numbers[i] = numbers[i] + 1; or numbers[i]++;
}
// DON'T DO THIS :
for (int i = 0; i < 4; i++) {
numbers[i] += 1;
}
}
如果你不使用花哨的計算來獲取索引但是使用索引進行迭代並且如果你需要不同的值來計算它們,那也是最好的。
例:
public void fillArrayWithDoubleIndex(int[] array) {
// DO THIS :
for (int i = 0; i < array.length; i++) {
array[i] = i * 2;
}
// DON'T DO THIS :
int doubleLength = array.length * 2;
for (int i = 0; i < doubleLength; i += 2) {
array[i / 2] = i;
}
}
以相反的順序訪問陣列
int[] array = {0, 1, 1, 2, 3, 5, 8, 13};
for (int i = array.length - 1; i >= 0; i--) {
System.out.println(array[i]);
}
使用臨時陣列來減少程式碼重複
迭代臨時陣列而不是重複程式碼可以使程式碼更清晰。它可用於對多個變數執行相同操作的情況。
// we want to print out all of these
String name = "Margaret";
int eyeCount = 16;
double height = 50.2;
int legs = 9;
int arms = 5;
// copy-paste approach:
System.out.println(name);
System.out.println(eyeCount);
System.out.println(height);
System.out.println(legs);
System.out.println(arms);
// temporary array approach:
for(Object attribute : new Object[]{name, eyeCount, height, legs, arms})
System.out.println(attribute);
// using only numbers
for(double number : new double[]{eyeCount, legs, arms, height})
System.out.println(Math.sqrt(number));
請記住,此程式碼不應用於效能關鍵部分,因為每次輸入迴圈時都會建立一個陣列,並且原始變數將被複制到陣列中,因此無法修改。