35 votes

Pourquoi une ArrayList de ArrayLists n'est-elle pas multidimensionnelle ?

J'ai récemment passé un entretien au cours duquel l'intervieweur m'a posé une question concernant Arrays y ArrayList .

Il m'a demandé si un tableau de tableaux pouvait être multidimensionnel, alors pourquoi un tableau de tableaux ne peut pas être multidimensionnel. ArrayList de ArrayList n'est pas multidimensionnelle ?

Par exemple :

// Multidimensional
int[][] array = new int[m][n]; 

// Not multidimensional
ArrayList<ArrayList<Integer>> seq = new ArrayList<ArrayList<Integer>>(); 

Quelqu'un peut-il m'aider à comprendre cela ?

1 votes

Toutes les listes ne doivent pas nécessairement avoir la même taille. En fait, certaines entrées de la liste extérieure peuvent être nulles.

12 votes

@MichaelMarkidis Les tableaux ne doivent pas tous avoir la même taille non plus.

7 votes

En fait, java n'a pas vrai Les tableaux 2D, ils sont implémentés comme des tableaux de tableaux, mais je peux comprendre quand les gens disent que c'est 2D...

25voto

Aomine Points 42709

Cay S. Horstmann a déclaré dans son livre Core Java pour les impatients :

Il n'existe pas de listes de tableaux à deux dimensions en Java, mais vous pouvez déclarer une variable de type ArrayList<ArrayList<Integer>> et construire les rangs vous-même.

en raison du fait que ArrayList peuvent s'étendre et se rétrécir et devenir déchiquetés plutôt que multidimensionnels, on pourrait dire qu'il est no un tableau à deux dimensions, un sens multidimensionnel Correction de des lignes et des colonnes, c'est pourquoi j'ai également indiqué dans les commentaires que Java ne dispose pas de vrai des tableaux multidimensionnels, mais cela sort du cadre de votre question.

si vous êtes curieux de savoir pourquoi j'ai dit que Java n'avait pas vrai les tableaux multidimensionnels ont une lecture à les différences entre un tableau multidimensionnel et un tableau de tableaux en C# ?


Juste pour rendre ma réponse plus claire sur le fait que Java a vrai des tableaux multidimensionnels ou non, j'ai fait no J'ai dit que Java n'a pas de tableaux multidimensionnels, j'ai dit que Java n'a pas de tableaux multidimensionnels. vrai des tableaux multidimensionnels et, comme prévu, l'option JLS a déclaré :

Un tableau multidimensionnel ne doit pas nécessairement avoir des tableaux de même longueur à chaque niveau.

4 votes

Avoir des sous-réseaux de différentes longueurs n'est pas la partie excitante. Plus intéressant, le tableau multidimensionnel est un tableau de références, qui peuvent être null ou pointent vers le même tableau. Dans le cas de Object[][]… En effet, un tableau peut même contenir une référence à lui-même.

14voto

Pete Kirkham Points 32484

Pour la même raison, le sac à provisions dans lequel je mets tous mes sacs de rechange n'est pas un sac à provisions multidimensionnel.

Si je mets une noix dans un sac puis que je mets ce sac dans un autre sac, je dois effectuer deux opérations pour obtenir la noix.

Si, au contraire, je place l'écrou dans un plateau de composants à deux dimensions, je peux effectuer une seule opération pour y accéder en utilisant deux indices :

component tray source

De même, il existe une différence fondamentale entre une liste de listes (ou un tableau de tableaux) et un véritable tableau à deux dimensions : une seule opération prenant deux indices est utilisée pour accéder aux éléments d'un tableau à deux dimensions, tandis que deux opérations prenant chacune un indice sont utilisées pour accéder aux éléments d'une liste de listes.

Un ArrayList a un seul index, son rang est donc de 1. Un tableau à deux dimensions a deux index, son rang est de 2.

Remarque : par "tableau à deux dimensions", je ne fais pas référence à un tableau Java de (références à) tableaux, mais à un tableau à deux dimensions tel qu'on le trouve dans d'autres langages comme le FORTRAN. Java ne dispose pas de tableaux multidimensionnels. Si votre interlocuteur se référait spécifiquement aux "tableaux de tableaux" de Java, je ne serais pas d'accord avec lui, car les tableaux de Java ne sont pas multidimensionnels. int[][] définit un tableau de références à des tableaux d'entiers, et qui nécessite deux opérations de déréférencement pour accéder aux éléments. Un tableau de tableaux en C, par exemple, permet l'accès par une seule opération de déréférencement et est donc plus proche du cas multidimensionnel.

9 votes

Sur quel motif déclarez-vous array[index1][index2] pour être une opération unique mais list.get(index1).get(index2) pour être deux ? Dans les deux cas, je peux le diviser en deux opérations, par exemple tmp=array[index1]; result=tmp[index2];

0 votes

@Holger Je pense que le point ici est que Java n'a pas de support pour les tableaux multidimensionnels. Il a des tableaux de tableaux - comme des listes de listes. Je pense que dans ce cas, l'enquêteur a tort - il a peut-être posé une question tendancieuse.

0 votes

@Boris the Spider : Je sais, mais cette réponse semble le voir différemment

11voto

GhostCat Points 83269

D'un autre point de vue, vous pouvez utiliser les listes de la même manière que les tableaux "multidimensionnels". Il suffit de remplacer array[row][column] avec someList.get(row).get(column) ¡!

Et en fin de compte, les tableaux java sont mis en œuvre de manière similaire : une matrice à deux dimensions est également un tableau à une dimension de tableaux à une dimension ! En d'autres termes, la différence est plus superficielle et n'est pas ancrée dans des raisons conceptuelles profondes !

Et pour être vraiment précis : le système de types de Java vous permet de poser Object[][] donc dans ce sens, il connaît ce type de Object[][] Mais comme nous l'avons dit, en réalité, il n'y a pas de tableaux multidimensionnels, car Java voit cette chose "à deux dimensions" comme un tableau de références à des tableaux !

D'autre part : il existe une certaine notion de " tableaux multidimensionnels ", comme par exemple le Spécification de la JVM mentionne explicitement :

La première opérande de l'instruction multianewarray est l'index du pool de constantes d'exécution du type de classe de tableau à créer. La seconde est le nombre de dimensions de ce type de tableau à créer. L'instruction multianewarray peut être utilisée pour créer toutes les dimensions du type, comme le montre le code de create3DArray. Notez que le tableau multidimensionnel n'est qu'un objet et qu'il est donc chargé et retourné par une instruction aload_1 et areturn, respectivement.

0 votes

Le système de type java ne prend pas en charge les tableaux multidimensionnels. Il prend en charge les tableaux de tableaux, ce qui est un concept différent.

0 votes

@PeteKirkham Alors Object[][] n'est pas un type différent de Object[] ou Object ? Mais je comprends votre point de vue... et j'espère que les modifications apportées à ma réponse vous aideront.

0 votes

Ils sont de types différents, Object[][] est un tableau de ( tableau d'objets ), alors que Object[] est un tableau d'objets, tout comme int[] y int sont de différents types. Et si Java supportait les tableaux multidimensionnels, Object[,] serait à nouveau d'un type différent. Voir stackoverflow.com/questions/597720 pour C# qui dispose de tableaux multidimensionnels.

11voto

Jacob G. Points 16099

Je vais prendre des risques et répondre à cette question, mais il n'y a pas correct réponse à cette vaste question.

Nous devons d'abord nous demander ce qui rend un tableau multidimensionnel.

Je vais supposer que votre interlocuteur considère qu'un tableau multidimensionnel a une taille fixe (comme vous l'avez montré dans votre question), où il ne peut pas être considéré comme "irrégulier". Selon Microsoft, un dentelé en C# est le suivant :

Les éléments d'un tableau en dents de scie peuvent être de dimensions et de tailles différentes.

En Java, un tableau multidimensionnel est simplement un tableau, où chaque élément est également un tableau. Ces tableaux doivent être définis avec une taille fixe afin que les éléments puissent y être indexés, mais les tableaux multidimensionnels peuvent avoir des tailles différentes, comme indiqué ci-dessus.

Un ArrayList est soutenu par un tableau ; cependant, le tableau s'étend lorsqu'un certain nombre d'éléments y sont ajoutés. Pour cette raison, la fonction ArrayList pourrait devenir déchiqueté, et pourrait être considéré comme n'étant plus multidimensionnel.

Edit : Après avoir tout relu plusieurs fois, je suis sûr que votre interlocuteur essayait juste de vous embrouiller. Honnêtement, cela n'a pas de sens qu'un type de données (un tableau) soit multidimensionnel, et qu'un autre type de données (un tableau) soit multidimensionnel. ArrayList qui utilise un tableau) pour ne pas être multidimensionnel.

0 votes

Oui, la taille était fixe pour les tableaux multidimensionnels. Je pense aussi qu'à cause de la nature en dents de scie, arraylist ne peut pas être multidimensionnel. Et oui, vous avez raison, peut-être qu'il essaie de m'embrouiller, il a fait tourner les choses pendant une autre demi-heure.

1 votes

Je peux effectivement redimensionner les sous-réseaux d'un tableau multidimensionnel, c'est-à-dire array[index]=Arrays.copyOf(array[index], newSize);

11voto

Boann Points 11904

L'affirmation de l'enquêteur est absurde.

On peut soutenir, comme on le voit sur cette page, que Java ne dispose pas de véritables tableaux multidimensionnels, auquel cas il ne dispose pas non plus de ArrayLists multidimensionnelles. En revanche, il vous permet certainement de représenter des structures multidimensionnelles via des tableaux et des ArrayLists de la même manière.

Définir une distinction majeure entre les deux est assez arbitraire et inutile.

Il est possible que l'examinateur ait simplement essayé de lancer un débat technique, pour tester votre capacité à expliquer les détails.

1 votes

+1 pour la seule dernière phrase. Ce genre de questions est vraiment utile pour évaluer l'étendue des connaissances techniques d'un candidat.

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