Un extrait de conférence avec un mentor dans le cadre du cours Codegym University. Inscrivez-vous au cours complet.


"Bonjour Amigo !"

« Bonjour, Rishi ! »

"Vous savez déjà une chose ou deux sur les tableaux, et vous avez même réussi à résoudre certaines tâches, j'espère. Mais vous ne savez pas tout. Par exemple, voici un autre fait intéressant sur les tableaux. Les tableaux ne sont pas seulement unidimensionnels (linéaires ). Ils peuvent aussi être bidimensionnels."

"Euh... Qu'est-ce que ça veut dire ?"

"Cela signifie que les cellules du tableau peuvent représenter non seulement une colonne (ou une ligne), mais également un tableau rectangulaire.

int[][]name = new int[width][height];

"Où nom est le nom de la variable de tableau, largeur est la largeur du tableau (en cellules) et hauteur est la hauteur du tableau. Jetez un œil à un exemple :

int[][] data = new int[2][5];
data[1][1] = 5;
Nous créons un tableau à deux dimensions : 2 colonnes et 5 lignes.
Nous écrivons 5 dans la cellule (1,1).

"Voici à quoi cela ressemblera dans la mémoire :

Tableaux à deux dimensions

"Au fait, pour les tableaux à deux dimensions, vous pouvez également utiliser l'initialisation rapide :

// Lengths of months of the year in each quarter
int[][] months = { {31, 28, 31}, {30, 31, 30}, {31, 31, 30}, {31, 30, 31} };

"Hmm... maintenant c'est intéressant. Si nous imaginons que dans les premières parenthèses intérieures représentent un élément, le suivant est un second... Donc un tableau à deux dimensions est comme un tableau de tableaux ?"

"Quel élève intelligent vous êtes ! Exactement. Le premier élément est le tableau à une dimension {31, 28, 31}, le second est {30, 31, 30}, et ainsi de suite. Mais nous y reviendrons un peu plus tard dans cette leçon. En attendant, essayez de penser à un tableau à deux dimensions sous forme de tableau avec des lignes et des colonnes, formant des cellules à chaque intersection.

« J'ai une image mentale de cela. Au fait, à quoi servent-ils, ces tableaux à deux dimensions ? »

"Les programmeurs ont souvent besoin de tableaux bidimensionnels. Si vous regardez attentivement, presque tous les jeux de société sont implémentés à l'aide d'un tableau bidimensionnel prêt à l'emploi : échecs, dames, tic-tac-toe, bataille navale, etc. :"

bataille navale

"Je comprends ! Le terrain de jeu des échecs ou de la bataille navale s'intègre parfaitement dans des tableaux bidimensionnels !"

"Oui, mais vous devez utiliser des nombres comme coordonnées de cellule. Pas 'pion e2-e4', mais 'pion (5,2) -> (5,4)'. Ce sera encore plus facile pour vous en tant que programmeur. "

Organiser les éléments dans des tableaux : (x, y) ou (y, x)

"La création de tableaux à deux dimensions soulève un dilemme intéressant. Lorsque nous créons un tableau à l'aide de new int [2][5];, avons-nous un tableau de 'deux lignes et 5 colonnes ' ou s'agit-il de 'deux colonnes et 5 lignes'?"

"En d'autres termes, il n'est pas tout à fait clair si nous spécifions d'abord la largeur puis la 'hauteur... ou vice versa, d'abord la hauteur puis la largeur ?"

"Oui, c'est le dilemme. Et il n'y a pas de réponse définitive."

"Ce qu'il faut faire?"

"Tout d'abord, il est important de comprendre comment notre tableau à deux dimensions est réellement stocké en mémoire . Naturellement, la mémoire de l'ordinateur ne contient en fait aucune table : chaque emplacement en mémoire a une adresse numérique séquentielle : 0, 1, 2, ... Pour nous, c'est un tableau 2 × 5, mais en mémoire ce n'est que 10 cellules, rien de plus. Pas de division en lignes et en colonnes."

"J'ai compris cela. Comment alors déterminons-nous quelle dimension vient en premier - la largeur ou la hauteur?"

"Considérons la première option. La largeur d'abord, puis la hauteur. "L'argument en faveur de cette approche est le suivant : tout le monde apprend les mathématiques à l'école et apprend que les paires de coordonnées sont écrites sous la forme "x" (c'est-à-dire l'axe horizontal). puis 'y' (la dimension verticale). Et ce n'est pas seulement une norme scolaire - c'est une norme généralement acceptée en mathématiques. Comme on dit, on ne peut pas discuter avec les maths."

"Est-ce vrai? Eh bien, si nous ne pouvons pas le combattre, alors d'abord la largeur, puis la hauteur?"

"Il existe un argument intéressant en faveur de 'la hauteur d'abord, puis la largeur' . Cet argument vient de l'initialisation rapide des tableaux à deux dimensions. Après tout, si nous voulons initialiser notre tableau, nous écrivons du code comme ceci :"

// Matrix of important data
int[][] matrix = { {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5} };

"Alors, qu'est-ce que cela nous fait ?"

« Avez-vous remarqué quelque chose ? Et si on avait ça ?

// Matrix of important data
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {1, 2, 3, 4, 5}
};

"Si nous écrivons nos données dans le code ligne par ligne, nous obtenons un tableau avec 2 lignes et 5 colonnes."

"Maintenant je vois. 2 est la hauteur, et 5 est la largeur... Alors quelle option devrions-nous utiliser ?"

"C'est à vous de décider ce qui est le plus pratique. Le plus important est que tous les programmeurs travaillant sur le même projet s'en tiennent à la même approche."

"Si vous travaillez sur un projet dont le code contient de nombreux tableaux bidimensionnels initialisés, alors tout sera probablement basé sur une initialisation rapide des données, c'est-à-dire que vous aurez la norme" hauteur x largeur ".

"Si vous vous trouvez dans un projet impliquant beaucoup de mathématiques et travaillant avec des coordonnées (par exemple, des moteurs de jeu), alors le code adoptera très probablement l'approche 'largeur x hauteur'.

Comment les tableaux à deux dimensions sont arrangés

« Maintenant, vous souvenez-vous de la particularité des tableaux à deux dimensions que vous avez remarquée au début de la leçon ? »

"Oui ! C'est que les tableaux à deux dimensions sont en fait des tableaux de tableaux !"

"Tout à fait. "En d'autres termes, si dans le cas d'un tableau ordinaire, une variable de tableau stocke une référence à un conteneur qui stocke des éléments de tableau, alors dans le cas de tableaux à deux dimensions, la situation explose un peu : une variable à deux dimensions La variable -array stocke une référence à un conteneur qui stocke des références à des tableaux unidimensionnels. Il vaut mieux le voir en action une fois plutôt que d'essayer de l'expliquer cent fois :"

Comment les tableaux à deux dimensions sont arrangés

"Sur la gauche , nous avons une variable de tableau à deux dimensions, qui stocke une référence à un objet de tableau à deux dimensions. Au milieu, il y a un objet de tableau à deux dimensions dont les cellules stockent des tableaux à une dimension, qui sont les lignes d'un tableau à deux dimensions. Et sur la droite , vous pouvez voir quatre tableaux à une dimension - les lignes de notre tableau à deux dimensions. C'est ainsi que fonctionnent réellement les tableaux à deux dimensions.

« Fantastique ! Mais qu'est-ce que ça nous donne ?

"Puisqu'un 'conteneur de conteneurs' stocke des références à des 'tableaux de lignes', nous pouvons très rapidement et facilement échanger des lignes. Pour obtenir un 'conteneur de conteneurs', il vous suffit de spécifier un index au lieu de deux. Exemple :

int[][] data = new int[2][5];
int[] row1 = data[0];
int[] row2 = data[1];

"Regardez le code ci-dessous. Nous pouvons l'utiliser pour échanger des lignes :"

// Matrix of important data
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {5, 4, 3, 2, 1}
};

int[] tmp = matrix[0];
matrix[0] = matrix[1];
matrix[1] = tmp;
Le tableau à deux dimensions





matrix[0]stocke une référence à la première ligne.
On échange les références.

En conséquence, le matrixtableau ressemble à ceci :
{
  {5, 4, 3, 2, 1},
  {1, 2, 3, 4, 5}
};

"Compris. Cela fonctionne comme échanger deux objets ordinaires."

"C'est le cas. Eh bien, si vous vous référez à une cellule d'un tableau à deux dimensions, mais que vous ne spécifiez qu'un seul index après le nom du tableau, alors vous faites référence à un conteneur de conteneurs dont les cellules stockent des références à un- tableaux dimensionnels."

"Tout semble logique et clair. Merci pour le cours, Rishi!"

"De rien. Mettez-le en pratique avec sagesse."