HOWTO · Java

Découper un tableau en Java

Cet article vous aidera à découper un tableau en sous-tableau à l'aide de Java.

Sur cette page

Pour extraire une portion d’un tableau Java, copiez les éléments d’une plage contiguë dans un nouveau tableau. Les exemples ci-dessous utilisent une plage dont l’indice de début est inclus et celui de fin exclu : fromIndex est inclus et toIndex correspond au premier indice non retenu. Par exemple, la plage [2, 5) sélectionne les indices 2, 3 et 4. Le tableau d’origine reste inchangé.

Extraire une portion d’un tableau Java en copiant ses éléments

Une boucle rend explicite la correspondance entre les indices. Allouez le tableau de résultat avec une longueur de toIndex - fromIndex, puis copiez chaque valeur sélectionnée à la position correspondante dans ce tableau.

Ce programme complet sélectionne les indices 1 à 3 d’un tableau d’entiers :

import java.util.Arrays;

public class ArraySliceLoop {
    static int[] slice(int[] values, int fromIndex, int toIndex) {
        int[] result = new int[toIndex - fromIndex];
        for (int i = 0; i < result.length; i++) {
            result[i] = values[fromIndex + i];
        }
        return result;
    }

    public static void main(String[] args) {
        int[] values = {10, 20, 30, 40, 50};
        int[] part = slice(values, 1, 4);
        System.out.println(Arrays.toString(part));
    }
}

Le résultat est un tableau distinct. Le compteur de boucle i commence à zéro pour le tableau de résultat, tandis que fromIndex + i repère l’élément correspondant dans le tableau source. Appelez la méthode avec des indices qui définissent une plage valide dans le tableau source.

Extraire une portion d’un tableau Java avec la méthode copyOfRange()

Arrays.copyOfRange() permet de créer directement un nouveau tableau à partir d’une plage. Cette méthode appartient à java.util.Arrays ; son argument from est inclus et son argument to est exclu. Le nom exact de l’API comprend copyOfRange().

Ce programme copie les indices 1, 2 et 3 :

import java.util.Arrays;

public class ArraySliceCopyOfRange {
    public static void main(String[] args) {
        int[] values = {10, 20, 30, 40, 50};
        int[] part = Arrays.copyOfRange(values, 1, 4);
        System.out.println(Arrays.toString(part));
    }
}

Le tableau renvoyé contient les valeurs sélectionnées ; le modifier ne remplace pas les éléments du tableau d’origine. Pour les tableaux de types primitifs, tels que int[], les valeurs sont copiées. Pour les tableaux d’objets, le tableau est nouveau, mais ses éléments restent des références aux mêmes objets.

Extraire une portion d’un tableau Java avec un flux

Un flux peut sélectionner des valeurs d’un tableau en associant les indices d’un flux aux éléments du tableau source. Cette approche est facultative : utilisez-la uniquement si l’environnement Java configuré pour votre projet prend en charge les API de flux nécessaires. Aucune version de l’environnement n’est supposée ici.

L’opération peut s’écrire ainsi : IntStream.range(fromIndex, toIndex).map(i -> values[i]).toArray(). IntStream.range inclut le début et exclut la fin ; il suit donc la même convention de plage que les autres méthodes. Cette expression concise est donnée à titre d’illustration : vérifiez que les API sont disponibles dans la version de Java déclarée pour votre projet avant de l’utiliser. Si cette version est inconnue, une boucle ou Arrays.copyOfRange() constitue une solution directe.

Extraire une portion d’un tableau Java avec la méthode System.arraycopy

System.arraycopy copie un nombre déterminé d’éléments d’un tableau vers un autre. Créez un tableau de destination de longueur toIndex - fromIndex, puis indiquez la position source, la position de destination et le nombre d’éléments à copier.

import java.util.Arrays;

public class ArraySliceSystemArraycopy {
    public static void main(String[] args) {
        int[] values = {10, 20, 30, 40, 50};
        int fromIndex = 1;
        int toIndex = 4;
        int[] part = new int[toIndex - fromIndex];
        System.arraycopy(values, fromIndex, part, 0, part.length);
        System.out.println(Arrays.toString(part));
    }
}

Les arguments correspondent au tableau source, à la position de départ dans la source, au tableau de destination, à la position de départ dans la destination et au nombre d’éléments à copier. Ici, la position de destination vaut zéro : la plage sélectionnée remplit donc part à partir de son premier élément. Les types des éléments des tableaux source et de destination doivent être compatibles, et les positions ainsi que la longueur doivent respecter les limites des deux tableaux.

Extraire une portion d’un tableau Java avec asList et subList

Pour les tableaux de types référence, Arrays.asList() crée une liste de taille fixe adossée au tableau. subList(fromIndex, toIndex) renvoie une vue de la plage sélectionnée dans cette liste. Convertissez cette vue en tableau si vous avez besoin d’un tableau de résultat distinct.

import java.util.Arrays;
import java.util.List;

public class ArraySliceSubList {
    public static void main(String[] args) {
        String[] values = {"red", "green", "blue", "gold"};
        List<String> list = Arrays.asList(values);
        List<String> selected = list.subList(1, 3);
        String[] part = selected.toArray(new String[0]);
        System.out.println(Arrays.toString(part));
    }
}

La liste renvoyée par Arrays.asList() a une taille fixe : vous pouvez remplacer un élément, mais pas ajouter ni supprimer d’entrées. La sous-liste est une vue liée à cette liste. L’appel à toArray() crée un tableau distinct, même si ses éléments objets restent des références aux mêmes objets. Cette approche convient aux tableaux de types référence tels que String[] ; les tableaux de types primitifs nécessitent une méthode adaptée, comme la boucle, copyOfRange() ou System.arraycopy présentés plus haut.

Conclusion

Utilisez une boucle si vous souhaitez voir ou personnaliser la copie élément par élément. Choisissez Arrays.copyOfRange() pour copier directement une plage dans un tableau, ou System.arraycopy si vous voulez préciser la position de destination et le nombre d’éléments à copier. Un flux permet de sélectionner des éléments par leurs indices lorsque l’environnement Java du projet prend en charge les API nécessaires. Pour les tableaux de types référence, asList et subList fournissent une vue sous forme de liste ; appelez toArray() pour obtenir un tableau de résultat distinct.