Iterating over arrays
suggest changeYou can iterate over arrays either by using enhanced for loop (aka foreach) or by using array indices:
int[] array = new int[10]; // using indices: read and write for (int i = 0; i < array.length; i++) { array[i] = i; }
// extended for: read only for (int e : array) { System.out.println(e); }
It is worth noting here that there is no direct way to use an Iterator on an Array, but through the Arrays library it can be easily converted to a list to obtain an Iterable
object.
For boxed arrays use Arrays.asList:
Integer[] boxed = {1, 2, 3}; Iterable<Integer> boxedIt = Arrays.asList(boxed); // list-backed iterable Iterator<Integer> fromBoxed1 = boxedIt.iterator();
For primitive arrays (using java 8) use streams (specifically in this example - Arrays.stream -> IntStream):
int[] primitives = {1, 2, 3}; IntStream primitiveStream = Arrays.stream(primitives); // list-backed iterable PrimitiveIterator.OfInt fromPrimitive1 = primitiveStream.iterator();
If you can’t use streams (no java 8), you can choose to use google’s guava library:
Iterable<Integer> fromPrimitive2 = Ints.asList(primitives);
In two-dimensional arrays or more, both techniques can be used in a slightly more complex fashion.
Example:
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; } }
for (int[] numbers : array) { for (int value : numbers) { System.out.println(value); } }
It is impossible to set an Array to any non-uniform value without using an index based loop.
Of course you can also use while
or do-while
loops when iterating using indices.
One note of caution: when using array indices, make sure the index is between 0
and array.length - 1
(both inclusive). Don’t make hard coded assumptions on the array length otherwise you might break your code if the array length changes but your hard coded values don’t.
Example:
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; } }
It’s also best if you don’t use fancy calculations to get the index but use the index to iterate and if you need different values calculate those.
Example:
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; } }
Accessing Arrays in reverse order
int[] array = {0, 1, 1, 2, 3, 5, 8, 13}; for (int i = array.length - 1; i >= 0; i--) { System.out.println(array[i]); }
Using temporary Arrays to reduce code repetition
Iterating over a temporary array instead of repeating code can make your code cleaner. It can be used where the same operation is performed on multiple variables.
// 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));
Keep in mind that this code should not be used in performance-critical sections, as an array is created every time the loop is entered, and that primitive variables will be copied into the array and thus cannot be modified.