web-dev-qa-db-fra.com

Pourquoi une liste de tableaux de listes de tableaux n'est-elle pas multidimensionnelle?

J'ai récemment comparu pour une interview dans laquelle l'intervieweur m'a posé une question concernant Arrays et ArrayList.

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

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?

34
Lokesh

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

Il n'y a pas de liste de tableaux à deux dimensions en Java, mais vous pouvez déclarer une variable de type ArrayList<ArrayList<Integer>> et construisez les rangées vous-même.

en raison du fait que ArrayLists peut se dilater et se rétrécir et devenir irrégulier plutôt que multidimensionnel, on pourrait dire que ce n'est pas deux tableau multidimensionnel, signification multidimensionnelle lignes et colonnes fixes , d'où la raison pour laquelle j'ai également indiqué dans les commentaires Java n'a pas de vrais tableaux multidimensionnels mais cela sort du cadre de votre question.

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


Juste pour clarifier ma réponse quant à savoir si Java a vrai tableaux multidimensionnels ou non, je l'ai fait pas dire Java n'a pas de tableaux multidimensionnels, j'ai dit Java doesn ' t ont vrai tableaux multidimensionnels et comme prévu, le JLS a déclaré:

Un tableau multidimensionnel n'a pas besoin d'avoir des tableaux de la même longueur à chaque niveau.

24
Aomine

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 un écrou dans un sac puis le mets dans un autre sac, je dois effectuer deux opérations pour obtenir l'écrou.

Si je place l'écrou dans un bac à composants bidimensionnel, je peux effectuer une opération pour y accéder en utilisant deux indices:

component traysource

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

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

note: par "tableau bidimensionnel", je ne fais pas référence à un Java tableau de (références à) tableaux, mais à un tableau bidimensionnel que l'on trouve dans d'autres langages comme FORTRAN. Java n'a pas de tableaux multidimensionnels. Si votre intervieweur faisait spécifiquement référence à Java "tableaux de tableaux", je ne serais pas d'accord avec eux, comme le définit int[][] Java). 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 prend en charge l'accès avec une seule opération de déréférencement, ce qui est plus proche du cas multidimensionnel.

13
Pete Kirkham

En regardant de l'autre côté: vous pouvez utiliser les listes de la même manière que les tableaux "multidimensionnels". Vous n'avez qu'à remplacer array[row][column] Par someList.get(row).get(column)!

Et à la fin, Java sont implémentés de manière similaire: une matrice à deux dim est aussi juste un tableau à un dim d'un tableau à dim! En d'autres termes: la différence est plus à la surface, pas enraciné dans des raisons conceptuelles profondes!

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

D'un autre côté: il existe une certaine notion de "tableaux multidimensionnels", comme par exemple le spécification JVM mentionne explicitement:

Le premier opérande de l'instruction multianewarray est l'index de pool de constantes d'exécution du type de classe de tableau à créer. Le second est le nombre de dimensions de ce type de tableau à créer réellement. 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 est donc chargé et renvoyé par une instruction aload_1 et areturn, respectivement.

11
GhostCat

La prétention de l'intervieweur est absurde.

On peut soutenir, comme vous le voyez sur cette page, que Java n'a pas de vrais tableaux multidimensionnels, auquel cas il n'a pas non plus de tableaux multidimensionnels. D'un autre côté, il vous permet certainement de représentent les structures multidimensionnelles via des tableaux et des listes de tableaux de la même manière.

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

Peut-être que l'intervieweur essayait juste de lancer un débat technique, pour tester votre capacité à expliquer les détails.

11
Boann

Je vais aller sur un membre ici et répondre à celui-ci, mais il n'y a pas réponse correcte pour cette large question.

Nous devons d'abord nous demander, qu'est-ce qui rend un tableau multidimensionnel?

Je vais supposer que votre intervieweur considère un tableau multidimensionnel avec 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 tableau dentelé en C # est le suivant:

Les éléments d'un tableau dentelé peuvent avoir des dimensions et des 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 soient indexés en leur sein, mais les tableaux irréguliers peuvent être de tailles différentes, comme indiqué ci-dessus.

Un ArrayList est soutenu par un tableau; cependant, le tableau se développe lorsqu'un certain nombre d'éléments lui sont ajoutés. Pour cette raison, le ArrayList pourrait devenir irrégulier et pourrait être considéré comme n'étant plus multidimensionnel.

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

11
Jacob G.

Un ArrayList est une implémentation de List . C'est un List qui est implémenté à l'aide de tableaux. L'utilisation des tableaux est un détail d'implémentation. interface de liste ne prend pas en charge le concept de listes multidimensionnelles, vous ne vous attendez donc pas à ce que ArrayList le soit également. De plus, il n'est pas traité comme un cas d'utilisation d'un structure de données de liste traditionnelle .

Les tableaux prennent en charge la multidimensionnalité car c'est une fonctionnalité de langage de Java.

4
Samuel

Parce que ce n'est pas du tout dimensionnel. C'est un objet avec une API. Toute apparence de multidimensionnalité est fournie par son API, mais elle est purement dans l'œil du spectateur. Un tablea d'autre part is dimensionnel, et peut donc être multidimensionnel aussi.

0
user207421