CodeGym /Cours /JAVA 25 SELF /Tableaux irréguliers (Jagged Arrays)

Tableaux irréguliers (Jagged Arrays)

JAVA 25 SELF
Niveau 7, Leçon 4
Disponible

1. Les tableaux irréguliers se distinguent des tableaux 2D

Nous arrivons à un sujet que beaucoup appellent « tableaux irréguliers » — en anglais jagged arrays. Contrairement aux tableaux à deux dimensions, les tableaux irréguliers permettent d’avoir des lignes de longueurs différentes. C’est comme un complexe d’immeubles où chaque bâtiment a son propre nombre d’appartements: dans un bâtiment il y en a 5, dans un autre 20, et dans un troisième — un seul.

Un tableau irrégulier est un tableau dont chaque élément est lui-même un tableau, et ces tableaux imbriqués (on les appelle aussi « sous-tableaux ») peuvent avoir des longueurs différentes.

La différence principale:

  • Dans un tableau 2D, chaque « ligne » (et chaque « colonne ») contient le même nombre d’éléments. Exemple: int[][] grid = new int[3][5]; — nous avons toujours 3 lignes de 5 éléments.
  • Dans un tableau irrégulier, chaque ligne peut avoir une longueur différente ! Exemple: int[][] jagged = new int[3][]; — et ensuite seulement nous initialisons chaque ligne (sous-tableau) comme on le souhaite.

Voici à quoi cela ressemble visuellement:

Tableau 2D (3x3):
┌───┬───┬───┐
│ 1 │ 2 │ 3 │
├───┼───┼───┤
│ 4 │ 5 │ 6 │
├───┼───┼───┤
│ 7 │ 8 │ 9 │
└───┴───┴───┘

Tableau irrégulier (longueurs différentes):
┌───┬───┐
│ 1 │ 2 │
├───┼───┼───┬───┐
│ 3 │ 4 │ 5 │ 6 │
├───┼───┴───┴───┘
│ 7 │
└───┘

2. Syntaxe de déclaration et d’initialisation d’un tableau irrégulier

Déclarer un tableau irrégulier n’est pas plus compliqué que de déclarer les types précédents ! Pas de panique devant la double paire de crochets:


int[][] jaggedArray = new int[3][];
Déclaration d’un tableau irrégulier: la taille externe est définie, les tableaux internes ne sont pas encore créés

Cela signifie que nous avons un tableau de 3 éléments, et chacun d’eux est aussi un tableau de int. Mais pour l’instant, les tableaux internes ne sont pas créés ! Pour mieux comprendre, détaillons cela.

Initialisation pas à pas d’un tableau irrégulier

Étape 1 — création du tableau principal (externe):

int[][] jaggedArray = new int[3][];

Nous avons maintenant 3 « lignes », mais elles valent toutes null pour l’instant.

Étape 2 — création et initialisation des tableaux internes (sous-tableaux):
Par exemple, que la première ligne ait une longueur de 2, la deuxième — 4, la troisième — 3:

jaggedArray[0] = new int[2]; // 2 éléments dans la première ligne
jaggedArray[1] = new int[4]; // 4 éléments dans la deuxième ligne
jaggedArray[2] = new int[3]; // 3 éléments dans la troisième ligne

Étape 3 — remplissage avec des valeurs:
Les tableaux internes sont des tableaux ordinaires ! Par exemple:

jaggedArray[0][0] = 1;
jaggedArray[0][1] = 2;

jaggedArray[1][0] = 3;
jaggedArray[1][1] = 4;
jaggedArray[1][2] = 5;
jaggedArray[1][3] = 6;

jaggedArray[2][0] = 7;
jaggedArray[2][1] = 8;
jaggedArray[2][2] = 9;

Initialisation concise d’un tableau irrégulier

On peut créer et remplir un tableau irrégulier d’emblée, si vous connaissez les valeurs à l’avance:

int[][] jaggedArray = new int[][]
{
    new int[] { 1, 2 },
    new int[] { 3, 4, 5, 6 },
    new int[] { 7, 8, 9 }
};

Ou un peu plus court, en omettant le type des tableaux internes:

int[][] jaggedArray = 
{
    { 1, 2 },
    { 3, 4, 5, 6 },
    { 7, 8, 9 }
};

3. Parcours et travail avec les tableaux irréguliers

Parcourir un tableau irrégulier n’est pas plus compliqué qu’un tableau 2D, mais maintenant la boucle externe passe par les lignes, et la boucle interne parcourt les éléments de la ligne (qui peuvent avoir des longueurs différentes):

for (int i = 0; i < jaggedArray.length; i++) 
{
    System.out.println("Ligne " + i + ":");
    for (int j = 0; j < jaggedArray[i].length; j++) 
    {
        System.out.print(jaggedArray[i][j] + " ");
    }
    System.out.println();
}

Résultat à l’écran:

Ligne 0:
1 2 
Ligne 1:
3 4 5 6 
Ligne 2:
7 8 9 

On peut utiliser for-each pour ne pas se soucier des indices:

for (int[] row : jaggedArray) 
{
    for (int value : row) 
    {
        System.out.print(value + " ");
    }
    System.out.println();
}

4. Scénarios typiques d’utilisation des tableaux irréguliers

Quand un tableau irrégulier peut-il être plus utile qu’un tableau 2D ?

  • Si vous stockez pour chaque utilisateur des quantités différentes de données: notes par matière, achats, commentaires, etc.
  • Si vos données ont une structure triangulaire ou en escalier (par exemple, pour afficher des pyramides, les triangles de Pascal, etc.).
  • Si vous souhaitez économiser de la mémoire: dans un tableau 2D, toutes les lignes sont fixes, alors que dans un tableau irrégulier — seulement le nombre d’éléments nécessaire.

Exemple concret: gestionnaire des notes des étudiants

Supposons que nous ayons trois étudiants, et voici leurs notes pour différents exercices de mathématiques:

Étudiant Notes
0 5, 4
1 3, 4, 4
2 5

Déclarons un tel tableau:

int[][] studentMarks = new int[3][];
studentMarks[0] = new int[] { 5, 4 };         // Premier étudiant — 2 notes
studentMarks[1] = new int[] { 3, 4, 4 };      // Deuxième étudiant — 3 notes
studentMarks[2] = new int[] { 5 };            // Troisième étudiant — 1 note

Affichons les notes de chaque étudiant:

for (int i = 0; i < studentMarks.length; i++) 
{
    System.out.print("Étudiant " + i + ": ");
    for (int j = 0; j < studentMarks[i].length; j++) 
    {
        System.out.print(studentMarks[i][j] + " ");
    }
    System.out.println();
}

Utilisation des tableaux irréguliers avec d’autres types

Un tableau irrégulier peut contenir n’importe quoi: des chaînes, des tableaux d’autres tableaux (plus en profondeur !), voire vos propres objets.

Exemple: tableau de chaînes

String[][] groups = {
    { "John", "Peter" },
    { "Maria", "Alex", "Serge" },
    { "Sarah" }
};

5. Tableaux tridimensionnels et multidimensionnels

Encore un fait intéressant sur les tableaux, auquel vous vous doutez sans doute déjà. S’il est possible de faire un tableau 2D, peut-on faire un tableau 3D ?

Oui, on peut créer des tableaux de n’importe quelle dimension. De tels tableaux sont appelés multidimensionnels.

Comment déclarer des tableaux multidimensionnels

Il suffit d’indiquer le nombre de dimensions avec des paires de crochets:

int[][][] cube = new int[2][3][4]; // 2 couches, 3 lignes, 4 colonnes
cube[0][1][2] = 99;

Nous avons ici un tableau tridimensionnel:

  • 2 éléments selon la première coordonnée,
  • 3 — selon la deuxième,
  • 4 — selon la troisième.

Un tel tableau est un grand « cube » de données, empaqueté séquentiellement.

Parcours d’un tableau 3D

L’accès à un élément se fait en utilisant tous les indices à la fois:

for (int i = 0; i < cube.length; i++) 
{
    for (int j = 0; j < cube[i].length; j++) 
    {
        for (int k = 0; k < cube[i][j].length; k++) 
        {
            System.out.print(cube[i][j][k] + " ");
        }
        System.out.println();
    }
    System.out.println("---");
}
  • Les indices commencent à zéro, comme toujours en Java.
  • Au total, ce tableau contient 2 × 3 × 4 = 24 éléments.

Exemples pratiques de tableaux multidimensionnels

  • 2D — tableaux, échiquiers, images.
  • 3D — « cubes » en infographie, données pour des calculs scientifiques (par exemple, la température en différents points de l’espace et du temps).
  • 4D et plus — rarement utilisés, mais présents en mathématiques avancées, simulations, apprentissage automatique, etc.

6. Erreurs typiques lors du travail avec des tableaux multidimensionnels

Erreur n° 1: Dépassement des bornes du tableau

L’erreur la plus courante est d’essayer d’accéder à un élément inexistant, par exemple:

int[][] arr = new int[2][3];
arr[2][0] = 5; // Erreur ! Pas de ligne d’indice 2 (seulement 0 et 1)
arr[0][3] = 7; // Erreur ! Pas de colonne d’indice 3 (seulement 0, 1, 2)

Dans ce cas, le programme lèvera une ArrayIndexOutOfBoundsException. Vérifiez toujours que les indices sont dans les limites autorisées: de 0 à longueur - 1.

Erreur n° 2: Lignes non initialisées dans un tableau irrégulier

Si vous créez un tableau irrégulier et oubliez d’initialiser les tableaux internes, un accès provoquera une NullPointerException:

int[][] jagged = new int[3][];
jagged[0][0] = 5; // Erreur ! jagged[0] == null

Il faut d’abord créer le tableau interne: jagged[0] = new int[2];

Erreur n° 3: Mauvaise utilisation de la longueur du tableau

On confond matrix.length (nombre de lignes) et matrix[0].length (nombre de colonnes). Cela arrive souvent lors des copies, des parcours, ou des sommes par colonnes.

Erreur n° 4: Supposer que toutes les lignes ont la même longueur

Dans les tableaux irréguliers, les lignes peuvent avoir des longueurs différentes ! Si vous écrivez matrix[i][j], assurez-vous que j < matrix[i].length.

Erreur n° 5: Confusion dans l’ordre des indices

On confond parfois l’ordre: d’abord la ligne, puis la colonne: matrix[ligne][colonne]. Pas l’inverse !

1
Mission
JAVA 25 SELF, niveau 7, leçon 4
Bloqué
Système flexible de succès du joueur 🏅
Système flexible de succès du joueur 🏅
1
Mission
JAVA 25 SELF, niveau 7, leçon 4
Bloqué
Liste des invités pour le dîner de fête 🥂
Liste des invités pour le dîner de fête 🥂
1
Mission
JAVA 25 SELF, niveau 7, leçon 4
Bloqué
Score total du joueur dans les mini-jeux 🎮
Score total du joueur dans les mini-jeux 🎮
1
Mission
JAVA 25 SELF, niveau 7, leçon 4
Bloqué
Le point le plus chaud du bâtiment d'après les capteurs 🔥
Le point le plus chaud du bâtiment d'après les capteurs 🔥
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION