Java Language Itération sur les tableaux


Exemple

Vous pouvez effectuer une itération sur les tableaux en utilisant des améliorations pour les boucles (aka foreach) ou en utilisant des index de tableaux:

int[] array = new int[10];

// using indices: read and write
for (int i = 0; i < array.length; i++) {
    array[i] = i;
}
Java SE 5
// extended for: read only
for (int e : array) {
    System.out.println(e);
}

Il convient de noter qu’il n’ya pas de moyen direct d’utiliser un Iterator sur un tableau, mais qu’il peut être facilement converti en une liste pour obtenir un objet Iterable via la bibliothèque Arrays.

Pour les tableaux en boîte, utilisez Arrays.asList :

Integer[] boxed = {1, 2, 3};
Iterable<Integer> boxedIt = Arrays.asList(boxed); // list-backed iterable
Iterator<Integer> fromBoxed1 = boxedIt.iterator();

Pour les tableaux primitifs (utilisant java 8), utilisez des flux (en particulier dans cet exemple - Arrays.stream -> IntStream ):

int[] primitives = {1, 2, 3};
IntStream primitiveStream = Arrays.stream(primitives); // list-backed iterable
PrimitiveIterator.OfInt fromPrimitive1 = primitiveStream.iterator();

Si vous ne pouvez pas utiliser les flux (pas de Java 8), vous pouvez choisir d'utiliser la bibliothèque de goyave de Google:

Iterable<Integer> fromPrimitive2 = Ints.asList(primitives);

Dans les tableaux à deux dimensions ou plus, les deux techniques peuvent être utilisées de manière un peu plus complexe.

Exemple:

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;
    }
}
Java SE 5
for (int[] numbers : array) {
    for (int value : numbers) {
        System.out.println(value);
    }
}

Il est impossible de définir un tableau sur une valeur non uniforme sans utiliser une boucle basée sur un index.

Bien sûr, vous pouvez également utiliser des boucles while ou do-while lors d'une itération à l'aide d'indices.

Une note de prudence: lorsque vous utilisez des indices de tableau, assurez-vous que l'index est compris entre 0 et array.length - 1 (tous deux inclus). Ne faites pas d'hypothèses codées sur la longueur du tableau, sinon vous risquez de casser votre code si la longueur du tableau change, mais pas vos valeurs codées en dur.

Exemple:

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;
    }
}

Il est également préférable que vous n'utilisiez pas de calculs fantaisistes pour obtenir l'index mais que vous utilisiez l'index pour effectuer des itérations et que si vous avez besoin de valeurs différentes, calculez-les.

Exemple:

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;
    }
}

Accéder aux tableaux dans l'ordre inverse

int[] array = {0, 1, 1, 2, 3, 5, 8, 13};
for (int i = array.length - 1; i >= 0; i--) {
   System.out.println(array[i]);
}

Utilisation de tableaux temporaires pour réduire la répétition du code

Itérer sur un tableau temporaire au lieu de répéter le code peut rendre votre code plus propre. Il peut être utilisé lorsque la même opération est effectuée sur plusieurs 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));

Gardez à l'esprit que ce code ne doit pas être utilisé dans les sections critiques, car un tableau est créé chaque fois que la boucle est entrée et que les variables primitives sont copiées dans le tableau et ne peuvent donc pas être modifiées.