68 votes

Initialisateur de tableau à deux dimensions suivi de crochets

J'ai un problème pour comprendre ce morceau de code :

int[] it = new int[][]{{1}}[0];

Pourquoi est-elle compilable, et comment puis-je comprendre une telle déclaration ?

17 votes

Hors sujet, mais je suis surpris que cette question soit si bien accueillie. Il semble que la plupart des questions de nos jours qui font moins de quatre phrases et/ou qui demandent "qu'est-ce que ça fait" sont descendues jusqu'à l'oubli =P.

0 votes

@theGreenCabbage : Je pense que l'enthousiasme pour cette question est un peu surfait, mais je peux voir comment ce serait une ligne de code déroutante pour quelqu'un de nouveau à Java.

0 votes

@JeroenVannevel Oh, moi aussi j'ai été troublé quand je l'ai vu pour la première fois, donc je suppose que ça veut dire quelque chose !

103voto

Adam Arold Points 11130

Ce que vous faites ici est :

  1. Déclarer une nouvelle variable int[] it (qui est un tableau unidimensionnel)
  2. Attribution de sa valeur à partir du premier élément [0]
  3. du tableau bidimensionnel new int[][]
  4. qui est initialisé pour être {{1}}

Vous créez donc un tableau à deux dimensions que vous initialisez pour qu'il contienne un tableau qui contient 1 et en même temps vous prenez le premier élément du extérieur (qui est un tableau unidimensionnel contenant les éléments suivants 1 ) et l'assigner à votre variable.

0 votes

Cool. J'ai appris quelque chose de nouveau aujourd'hui. Donc techniquement, il n'y a pas besoin de ce tableau multidimensionnel ? Le site {{1}} consiste simplement à placer un seul 1 en une multidimensionnelle. Quelle pourrait être l'utilité d'une telle déclaration ?

0 votes

Je ne vois pas de raison valable de le faire dans ce contexte. Il peut être utile si vous devez fournir des paramètres dans ce format pour une ancienne bibliothèque.

1 votes

Très belle explication, "aussi simple que possible, aussi complexe que nécessaire" :)

29voto

christopher Points 15114
int[] it = new int[][]{{1}}[0];

Décortiquons chaque étape et ce qu'elle signifie.

new int[][] 

Il s'agit d'un nouveau tableau multidimensionnel.

{{1}} 

Il s'agit d'un tableau multidimensionnel littéral. Il crée un tableau qui ressemble à ceci :

[0] = [1]
[1] = []
[2] = []
...
[N] = []

Alors, prenez note, chaque à l'intérieur de ce tableau est lui-même un tableau. Vous avez donc spécifié que votre variable it est égal au premier tableau dans le tableau multidimensionnel, donc il équivaut directement à :

int[] it = new int[] {1};

4 votes

Au moment de la publication, je n'ai pas vraiment vu d'autres réponses qui décomposaient la déclaration de cette façon.

0 votes

J'aime ce genre d'explications. J'imite définitivement ce type de réponse lorsque j'essaie d'expliquer quelque chose qui décompose des éléments individuels correctement structurés. Parfois, j'apprends quelque chose en même temps que je le décompose ! Je m'en sers également lorsque j'essaie de déboguer mon propre code.

0 votes

Belle analyse, mais tu as mal saisi l'initialisateur : {{1}}, pas {{0}}.

9voto

NPE Points 169956

El new int[][]{{1}} alloue un nouveau tableau 1x1 2D. Le (seul) élément est fixé à 1.

El [0] renvoie une référence à la première (et unique) ligne, qui est de type int[] .

El int[] it = ... déclare une variable et l'initialise avec la référence ci-dessus.

Le résultat final est équivalent à int[] it = new int[]{1} .

1 votes

@kai : le résultat est un tableau 1D, mais vous utilisez un tableau 2D.

6voto

asteri Points 5836

Essentiellement, vous créez un tableau anonyme à deux dimensions ( new int[][]{{1}} ), puis de prendre le premier élément de ce tableau bidimensionnel ( {1} ) et l'assigne à la variable it .

Allons-y pas à pas, parce que c'est un peu déroutant.

new int[][]{{1}} : Cela crée un tableau à deux dimensions qui ne comporte qu'un seul élément : un tableau, qui contient un tableau, qui contient un tableau int (le chiffre 1). Comme il n'est assigné à aucune variable et qu'il ne sera pas accessible au-delà de cette déclaration, nous l'appelons "anonyme", et il a la plus petite portée possible.

[0] : Ceci accède au premier élément du tableau anonyme à deux dimensions que nous avons créé ci-dessus. Le premier élément est un un tableau à dimension contenant 1 (c'est-à-dire, {1} ).

int[] it = : Enfin, ici nous prenons ce tableau unidimensionnel récupéré et le stockons dans notre variable.

Soit dit en passant, il n'y a absolument aucune raison de procéder de cette manière, et cela semble simplement être un puzzle Java très intéressant.

6voto

Max Fichtelmann Points 983

Je vais essayer de le décomposer

new int[][] // an array of arrays (or 2-dimensional array)
{1} // an array instance with a single element: 1
{{1}} // an array instance with a single element: above array instance
[0] // the first element of an array

C'est donc à peu près équivalent au code suivant :

int[] inner = new int[1]; // an empty array with length 1
inner[0] = 1;
int[][] outer = new int[1][];
outer[0] = inner;

int[] it = outer[0];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X