otra - crear un arreglo de listas en java
¿Por qué una ArrayList de ArrayLists no es multidimensional? (7)
Cay S. Horstmann ha declarado en su libro Core Java para los impacientes :
No hay listas de matrices bidimensionales en Java, pero puede declarar una variable de tipo
ArrayList<ArrayList<Integer>>
y crear las filas usted mismo.
debido al hecho de que ArrayList
s puede expandirse y contraerse y hacerse irregular en lugar de multidimensional, se podría decir que no es una matriz bidimensional, es decir, filas y columnas fijas de significado multidimensional, por lo que también he indicado en los comentarios Java no tiene verdaderas matrices multidimensionales, pero esto está fuera del alcance de su pregunta.
Si tiene curiosidad sobre por qué dije que Java no tiene matrices multidimensionales verdaderas , tenga en cuenta las diferencias entre una matriz multidimensional y una matriz de matrices en C #.
Solo para aclarar mi respuesta con respecto a si Java tiene matrices multidimensionales verdaderas o no, no he dicho que Java no tenga matrices multidimensionales, dije que Java no tiene matrices multidimensionales verdaderas y como es de esperar que el JLS tenga fijado:
Una matriz multidimensional no necesita tener arreglos de la misma longitud en cada nivel.
Recientemente me presenté para una entrevista en la que el entrevistador me hizo una pregunta sobre Arrays
y ArrayList
.
Me preguntó si una matriz de matrices puede ser multidimensional, entonces ¿por qué una ArrayList
de ArrayList
no es multidimensional?
Por ejemplo:
// Multidimensional
int[][] array = new int[m][n];
// Not multidimensional
ArrayList<ArrayList<Integer>> seq = new ArrayList<ArrayList<Integer>>();
¿Alguien puede ayudarme a entender esto?
La afirmación del entrevistador no tiene sentido.
Se puede argumentar, como se ve en esta página, que Java no tiene matrices multidimensionales verdaderas, en cuyo caso tampoco tiene ArrayLists multidimensionales. Por otro lado, ciertamente le permite representar estructuras multidimensionales a través de matrices y ArrayLists de la misma manera.
Definir una distinción importante entre los dos es bastante arbitrario e inútil.
Posiblemente el entrevistador estaba tratando de comenzar un debate técnico, para poner a prueba su capacidad para explicar los detalles.
Mirándolo desde el otro lado: puede usar listas de la misma manera que las matrices "multidimensionales". Solo tiene que reemplazar array[row][column]
con someList.get(row).get(column)
!
Y al final, las matrices de Java se implementan de manera similar: una matriz de dos débiles también es solo una matriz tenue de una matriz oscura. En otras palabras: ¡la diferencia está más en la superficie, no enraizada en profundas razones conceptuales!
Y para ser realmente preciso: el sistema de tipo Java le permite dejar el Object[][]
en ese sentido, conoce ese tipo de Object[][]
; pero como se dijo, en realidad, no hay matrices multidimensionales; ¡Java ve esa cosa "dos débiles" como una serie de referencias a matrices!
Por otro lado, existe una cierta noción de "matrices multidimensionales", como por ejemplo la especificación JVM menciona explícitamente:
El primer operando de la instrucción multianewarray es el índice de grupo de constante en tiempo de ejecución para el tipo de clase de matriz que se creará. El segundo es el número de dimensiones de ese tipo de matriz para crear realmente. La instrucción multianewarray se puede usar para crear todas las dimensiones del tipo, como muestra el código para create3DArray. Tenga en cuenta que la matriz multidimensional es solo un objeto y, por lo tanto, se carga y devuelve mediante una instrucción aload_1 y areturn, respectivamente.
Por la misma razón, la bolsa de la compra en la que puse todas mis bolsas de compras de repuesto no es una bolsa de compras multidimensional.
Si pongo una nuez en una bolsa y la pongo en otra bolsa, tengo que realizar dos operaciones para obtener la nuez.
Si en cambio coloco la tuerca en una bandeja de componente bidimensional, puedo realizar una operación para acceder a ella utilizando dos índices:
De forma similar, existe una diferencia fundamental entre una lista de listas (o una matriz de matrices) y una verdadera matriz bidimensional: se utiliza una sola operación que toma dos índices para acceder a los elementos en una matriz bidimensional, dos operaciones que toman un índice son utilizado para acceder a los elementos en una lista de listas.
Una ArrayList tiene un índice único, por lo que tiene un rango de 1. Una matriz bidimensional tiene dos índices, su rango es 2.
nota: por ''matriz bidimensional'' no me refiero a una matriz Java de (referencias a) matrices, sino a una matriz bidimensional como se encuentra en otros lenguajes, como FORTRAN. Java no tiene matrices multidimensionales. Si su entrevistador se estaba refiriendo específicamente a "matrices de matrices" de Java, estaría en desacuerdo con ellas, ya que Java''s int[][]
define una matriz de referencias a matrices de enteros, y eso requiere dos operaciones de desreferenciación para acceder a los elementos. Una matriz de matrices en C, por ejemplo, admite el acceso con una sola operación de desreferenciación, por lo que se acerca más al caso multidimensional.
Porque no es dimensional en absoluto. Es un objeto con una API. Cualquier apariencia de multi-dimensionalidad es proporcionada por su API, pero es puramente en el ojo del espectador. Por otro lado, una matriz es dimensional y, por lo tanto, también puede ser multidimensional.
Un ArrayList
es una implementación de List . Es una List
que se implementa usando matrices. El uso de matrices es un detalle de implementación. La List no es compatible con el concepto de listas multidimensionales, por lo que tampoco esperaría ArrayList
. Además, no se trata como un caso de uso de una estructura de datos de lista tradicional .
Las matrices admiten la multidimensionalidad porque es una característica del lenguaje de Java.
Voy a dar un paso aquí y responder a este, sin embargo, no hay una respuesta correcta para esta gran pregunta.
Primero tenemos que preguntar, ¿qué hace que una matriz sea multidimensional?
Voy a suponer que su entrevistador considera una matriz multidimensional con un tamaño fijo (como lo ha demostrado en su pregunta), donde no se puede considerar "irregular". Según Microsoft, una matriz jagged en C # es la siguiente:
Los elementos de una matriz dentada pueden ser de diferentes dimensiones y tamaños.
En Java, una matriz multidimensional es simplemente una matriz, donde cada elemento también es una matriz. Estas matrices se deben definir con un tamaño fijo para que los elementos se indexen dentro de ellas, pero las matrices dentadas pueden ser de diferentes tamaños, como se indicó anteriormente.
Una ArrayList
está respaldada por una matriz; sin embargo, la matriz se expande cuando se le agrega una cierta cantidad de elementos. Por esta razón, ArrayList
podría volverse irregular y podría considerarse que ya no es multidimensional.
Editar: Después de volver a leer todo en varias ocasiones, estoy seguro de que su entrevistador estaba tratando de confundirlo. Honestamente, no tiene sentido que un tipo de datos (un conjunto) sea multidimensional, y otro tipo de datos (un ArrayList
que usa un conjunto) no sea multidimensional.