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 ?
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 ?
Ce que vous faites ici est :
int[] it
(qui est un tableau unidimensionnel)[0]
new int[][]
{{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.
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 ?
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.
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};
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.
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.
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}
.
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.
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 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.
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 !
6 votes
@theGreenCabbage questions suffisamment intéressantes sont au-dessus de la loi
2 votes
@theGreenCabbage donnez aux programmeurs un puzzle adapté et ils baveront. ;) (BTW cette question est maintenant présentée sur tous les sites SE)
0 votes
Eh bien, je suis certainement intéressé, mais je me demande pourquoi une telle déclaration serait utilisée. Il s'agit essentiellement d'une manière vraiment confuse de stocker une seule variable dans un mult-dimen. A quoi cela pourrait-il servir ?
25 votes
J'espère vraiment que vous avez trouvé cela dans un livre de "Java Tricks" ou autre, et qu'il ne s'agit pas d'un code de production réel que quelqu'un a écrit.
3 votes
Il pourrait s'agir d'un exemple simplifié de la situation concrète. Par exemple, il pourrait faire un champ 2x2 comme ceci et obtenir la première ligne :
int[] it = new int[][]{{1, 2}, {3, 4}}[0];
Ce n'est pas très courant, mais ce n'est pas non plus le code le plus illisible.0 votes
Vous assignez la valeur du premier élément "[0]" d'un tableau bidimensionnel "[][]" dont le premier élément est un tableau "{{}}" avec un élément dans celui-ci qui est un tableau "{1}" avec un élément "1" à une variable nouvellement déclarée "int[]" nommée "it". Dans le résultat, "it" est un tableau à un élément : {1} ;
1 votes
Ne serait pas
int[] it = new int[] {1};
être plus concis ?0 votes
Comment cette question peut-elle ne pas être un doublon plus de cinq ans après le début de Stack Overflow et avec environ 528571 questions sur Java ? Nous avons besoin d'une recherche humaine dans ce cas - Google n'est pas d'une grande aide. Un point de départ pourrait être une réponse à Initialisation d'un tableau multidimensionnel en Java qui a une structure similaire.
1 votes
@user2654250 Sachez que vous pouvez accepter une réponse si elle répond à votre question.
0 votes
@theGreenCabbage Je pense que la raison est l'aspect ésotérique du code qui compile réellement.
0 votes
Wow, j'ai supposé à première vue que c'était quelque chose de nouveau par rapport à C++11.
1 votes
@Chris Considérez ce code alors :
private List<String> list = new ArrayList<String>(){{ add("Something"); }};
. Cet exemple est presque aussi ésotérique que celui de la question. La première accolade crée une instance anonyme deArrayList
tandis que le second est un bloc d'initialisation d'instance (c'est pourquoi vous pouvez utiliser la fonctionadd
sans référence).1 votes
@AdamArold Vous ne pouvez pas me tromper avec celui-là, je le reconnais pour avoir utilisé JMock. :) Je ne pense pas l'avoir déjà utilisé dans un autre contexte que celui de JMock, tho.
0 votes
Je l'utilise ailleurs : dans Mockito HAHA.