Pourquoi un ArrayList d'ArrayLists n'est-il pas multidimensionnel?

j'ai récemment participé à une entrevue au cours de laquelle l'intervieweur m'a posé une question concernant Arrays et ArrayList .

il m'a demandé si un réseau 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?

33
demandé sur Lokesh 2017-05-09 06:34:09

7 réponses

Cay S. Horstmann, a déclaré dans son livre Core Java pour l'impatient :

il n'y a pas de listes de tableaux bidimensionnels en Java, mais vous pouvez déclarer un variable de type ArrayList<ArrayList<Integer>> et construire les lignes m'.

en raison du fait que ArrayList s peut se dilater et rétrécir et devenir dentelé plutôt que multidimensionnel, on pourrait dire qu'il est pas a tableau bidimensionnel, signification multidimensionnelle fixe lignes et colonnes, d'où la raison pour laquelle J'ai également déclaré dans les commentaires que Java n'a pas vrai tableaux multidimensionnels, mais cela dépasse la portée de votre question.

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


Juste pour faire ma réponse plus claire quant à savoir si Java a vrai multi-dimensions des tableaux ou non, je ne pas dire que java n'a pas de multi-dimensions des tableaux, j'ai dit que Java n'a pas de vrai multi-dimensions des tableaux et attendre le JLS a déclaré:

un multidimensionnel tableau n'a pas besoin de tableaux de la même longueur à chaque niveau.

23
répondu Aomine 2017-05-23 12:18:19

pour la même raison que le sac dans lequel j'ai mis tous mes sacs de rechange n'est pas un sac multidimensionnel.

Si j'ai mis un écrou dans un sac, puis mettez le sac dans un autre sac, je dois effectuer deux opérations pour obtenir de l'écrou.

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

component tray source

de même, il y a une différence fondamentale entre une liste de listes ( ou un tableau de tableaux ) et un tableau bidimensionnel véritable - 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 utilisées pour accéder aux éléments d'une liste de listes.

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

remarque: par "tableau à deux dimensions" je ne suis pas en se référant à un tableau Java (références) des tableaux, mais un tableau à deux dimensions, comme l'a constaté dans d'autres langages tels que le FORTRAN. Java n'a pas de tableaux multidimensionnels. Si votre interviewer se référait spécifiquement à Java 'tableaux de tableaux' alors je ne serais pas d'accord avec eux, comme int[][] de Java définit un tableau de références à des tableaux de nombres entiers, et qui nécessite deux opérations de déréférencement pour accéder élément. Un tableau de tableaux en C par exemple supporte l'accès avec une seule opération de déréférencement donc est plus proche du cas multidimensionnel.

13
répondu Pete Kirkham 2017-05-11 11:15:57

je vais prendre un risque ici et répondre à celle-ci, mais il n'y a pas de réponse correcte réponse à cette vaste question.

il faut d'abord se demander, qu'est-ce qui rend un réseau multidimensionnel?

je vais supposer que votre interviewer considère un tableau multidimensionnel de 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é tableau en C# est comme suit:

les éléments d'une rangée dentelée peuvent être de différentes dimensions et tailles.

En Java, un tableau multidimensionnel est tout simplement un tableau, où chaque élément est également un tableau. Ces tableaux doivent être définis avec une taille fixe pour les éléments à indexer à l'intérieur, mais les tableaux irréguliers peuvent être de différentes tailles, comme indiqué ci-dessus.

Un ArrayList est soutenu par un tableau; toutefois, la gamme s'élargit lorsqu'un certain nombre d'éléments sont ajoutés. C'est la raison pour laquelle le ArrayList pourrait se déchirer et ne plus être considéré comme multidimensionnel.

Edit: après avoir tout relu plusieurs fois, je suis sûr que votre interviewer essayait juste de vous confondre. Honnêtement, il n'est pas logique qu'un type de données (un tableau) soit multidimensionnel, et un autre type de données (un ArrayList qui utilise un array) pour ne pas être multidimensionnel.

11
répondu Jacob G. 2017-05-09 04:08:32

en le regardant de l'autre côté: vous pouvez utiliser des listes de la même manière que des tableaux "multidimensionnels". Il suffit de remplacer array[row][column] par someList.get(row).get(column) !

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

et pour être vraiment précis: le type Java système vous permet de mettre vers le bas 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 que" deux dim " chose comme un tableau de références à des tableaux!

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

le premier opérande du l'instruction multianewarray est l'indice de pool de constante de temps d'exécution du type de classe de tableau à créer. Le second est le nombre de dimensions de ce type de tableau pour 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 retourné par une instruction aload_1 et aretrun, respectivement.

11
répondu GhostCat 2017-05-09 12:13:28

la demande de l'intervieweur est absurde.

On peut affirmer, comme vous le voyez sur cette page, que Java n'ont pas de véritable tableaux multidimensionnels, auquel cas il n'a pas multidimensionnelle ArrayLists. D'un autre côté, il permet certainement de représenter des structures multidimensionnelles via des tableaux et des 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.

10
répondu Boann 2017-05-09 13:02:50

Un ArrayList est une implémentation de Liste . C'est un List qui est implémenté en utilisant des tableaux. L'utilisation de tableaux est un détail d'implémentation. Le interface de liste ne supporte pas le concept de listes multidimensionnelles donc vous ne vous attendriez pas ArrayList à l'un ou l'autre. En outre, il n'est pas traité comme un cas d'utilisation d'une structure traditionnelle de données de liste .

soutien des matrices la multidimensionnalité parce que C'est une caractéristique du langage Java.

4
répondu Samuel 2017-05-09 03:57:28

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

0
répondu user207421 2017-05-09 10:05:26