1. Tableaux bidimensionnels

Un autre fait intéressant à propos des tableaux. Les tableaux ne sont pas seulement unidimensionnels (linéaires). Ils peuvent également être bidimensionnels.

Qu'est-ce que cela signifie, demandez-vous?

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

nom est le nom de la variable de tableau, largeur est la largeur du tableau (en cellules) et hauteur est la hauteur du tableau. Exemple:

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

Voici à quoi cela ressemblera en mémoire :

Tableaux à deux dimensions

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

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

Il y a tellement d'endroits où vous, en tant que programmeur, pourriez avoir besoin d'un tableau à deux dimensions. Les tableaux bidimensionnels sont à la base de presque tous les jeux de société, par exemple les échecs, les dames, le tic-tac-toe et la bataille navale :

Tableaux à deux dimensions 2

Les tableaux bidimensionnels sont parfaits pour les échecs ou la bataille navale. Nous n'avons besoin que de nombres à partir des coordonnées des cellules. Pas 'pion e2-e4', mais 'pion (5,2) -> (5,4)'. Ce sera encore plus facile pour vous en tant que programmeur.


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

Au fait, il y a un dilemme intéressant ici:

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, spécifions-nous d'abord la largeur puis la hauteur... ou vice versa, d'abord la hauteur puis la largeur ?Eh bien, comme on le dit souvent, tout n'est pas si simple ici.

Commençons par la question de savoir comment le tableau est stocké en mémoire .

Bien sûr, la mémoire de l'ordinateur n'a pas réellement de matrice : chaque emplacement en mémoire a une adresse numérique séquentielle : 0, 1, 2, ... Dans notre cas, on parle d'une matrice 2 × 5, mais en mémoire ce ne sont que 10 cellules consécutives, rien de plus. Rien n'indique où se trouvent les lignes et les colonnes.

Argument en faveur de "largeur x hauteur".

L'argument en faveur de cette approche est que tout le monde apprend les mathématiques à l'école, où ils apprennent 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? D'abord largeur puis hauteur ?

Argument en faveur de "hauteur x largeur".

Il y a aussi un argument intéressant à faire valoir pour cette position : l'initialisation rapide des tableaux à deux dimensions. En effet, si nous voulons initialiser notre tableau, alors nous pouvons écrire du code comme ceci :

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

Vous ne remarquez rien ? 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 une matrice de 2 lignes et 5 colonnes.

En bout de ligne

Que pouvons-nous dire? C'est à vous de décider ce qui vous convient le mieux. Le plus important est que tous les programmeurs travaillant sur le même projet adhèrent à la même approche.

Si vous travaillez sur un projet dont le code comporte 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 avez la chance de vous retrouver 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".


3. Comment les tableaux bidimensionnels sont arrangés

Et maintenant, vous allez apprendre comment les tableaux à deux dimensions sont réellement arrangés. Prêt?

Les tableaux à deux dimensions sont en fait des tableaux de tableaux !

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 de tableau à deux dimensions stocke un 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. Dans leau milieu , nous avons un objet 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 unidimensionnels — les lignes de notre tableau bidimensionnel.

C'est ainsi que fonctionnent réellement les tableaux à deux dimensions. Et cette approche donne au programmeur Java plusieurs avantages :

Tout d'abord , étant donné qu'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];

Ce code vous permet d'é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}
};

Si vous faites référence à une cellule d'un tableau à deux dimensions, mais que vous ne spécifiez qu'un seul index après le nom du tableau, vous faites référence à un conteneur de conteneurs dont les cellules stockent des références à des tableaux à une dimension ordinaires.