No mezcle matrices y colecciones. De hecho, no use matrices a menos que esté tratando con primitivas (o sepa lo que está haciendo). Las matrices son una pesadilla de usabilidad, hacen que su código sea imposible de mantener.
Sean Patrick Floyd
13
@SeanPatrickFloyd ¿Puede explicar por qué las matrices son una pesadilla de usabilidad?
usuario
3
@crucifiedsoul seguro. una matriz no puede crecer, no se puede insertar cualquier cosa en una matriz, una matriz no anula métodos estándar como iguales código hash o toString etc.
Sean Patrick Floyd
9
@SeanPatrickFloyd está bien, bueno, necesito exactamente cuatro listas de matrices, planeo acceder a cada una por índice, no necesito que la matriz externa crezca o se reduzca, no necesito ningún toString o hashcode, etc. - para mí, una matriz es la opción obvia aquí - ¿qué recomendarías como alternativa en esta situación?
BrainSlugs83
44
De acuerdo, esta es una vieja pregunta, pero voy a preguntar de todos modos y ver si alguien responde. Veo a todos hablando de por qué una serie de listas es una idea terrible, una mala práctica de codificación, etc. Lo busqué porque estoy aprendiendo a hacer cadenas hash, ¡y la definición de una cadena hash es una serie de listas! Entonces, ¿cómo puede una estructura de datos de programación central ser una práctica de codificación terrible? ¿O esto simplemente cae en la categoría IYKWYD mencionada por @Sean?
List<List<Individual>> group = new ArrayList<List<Individual>>();Probablemente sería mejor.
Tom Hawtin - tackline
44
¿Qué significa "no se puede crear una matriz de tipo genérico"? Eso realmente no tiene sentido para mí porque no es genérico si proporciona lo que se supone que debe contener, ¿verdad?
Andy
55
Estoy sorprendido de los votos positivos ya que no responde la pregunta (es decir, quiero hacer esto, ¿cómo puedo hacerlo?). Excepto tal vez por la primera oración.
Florian F
15
¿Por qué es List Reference mejor que ArrayList?
shifu
3
@shifu una referencia de Lista es más general que ArrayList; declarar como List abstrae la API de ArrayList que se extiende más allá de List API. Eso es bueno porque simplifica la referencia a la Lista cuya API probablemente tiene la totalidad de lo que la Lista necesita de todos modos, sin saturar la API de esa referencia con los extras que tiene ArrayList. Solo debe declarar como ArrayList si necesita que algo específico de su API esté disponible a través de la referencia.
cellepo
98
Como los otros han mencionado, probablemente sea mejor usar otra lista para almacenar ArrayList, pero si tiene que usar una matriz:
ArrayList<Individual>[] group =(ArrayList<Individual>[])newArrayList[4];
Esto tiene el beneficio deseado de que no se compila agregar una Lista de Array de cualquier Objeto además de Cadena (es decir, en ArrayList<String>lugar de ArrayList<NotString>)group
cellepo
12
Esto produce una advertencia:Note: hello.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
No lo entiendo totalmente, por qué todo el mundo sugiere el tipo genérico sobre la matriz, especialmente para esta pregunta.
¿Qué pasa si mi necesidad es indexar ndiferentes listas de matrices?
Con la declaración List<List<Integer>>, necesito crear nArrayList<Integer>objetos manualmente o poner un bucle for para crear nlistas o de alguna otra manera, de cualquier manera siempre será mi deber crear nlistas.
¿No es genial si lo declaramos a través del casting como List<Integer>[] = (List<Integer>[]) new List<?>[somenumber]. Lo veo como un buen diseño donde uno no tiene que crear todos los objetos de indexación (listas de matriz) por sí mismo
¿Alguien puede aclararme por qué esta (forma de matriz) será un mal diseño y cuáles son sus desventajas?
AFAICT parece ser una especie de mentalidad de culto de carga inducida por el horrible sistema de escritura que Java trae a la mesa.
BrainSlugs83
@smsIce: No es un mal diseño. El problema es que muchos escritores no leen la pregunta completa o no la entienden claramente.
testo
16
Puedes crear Array of ArrayList
List<Integer>[] outer =newList[number];for(int i =0; i < number; i++){
outer[i]=newArrayList<>();}
Esto será útil en escenarios como este. Sabes el tamaño del exterior. Pero el tamaño de los interiores varía. Aquí puede crear una matriz de longitud fija que contenga listas de matrices de tamaño variable. Espero que esto sea útil para ti.
En Java 8 y superior puedes hacerlo de una manera mucho mejor.
List<Integer>[] outer =newList[number];Arrays.setAll(outer, element ->newArrayList<>());
Cuando use el ArrayList::new, llamará al ArrayList(int)constructor con el índice actual como argumento: ArrayList (1), ArrayList (2), ArrayList (3), etc. De este modo, terminará con matrices de menor o mayor tamaño, Dependiendo de su uso. Me desalentar a usarlo y en su lugar prefieren el segundo enfoque en el que se llama al constructor sí mismo en su expresión lambda.
Genhis
8
Esto funciona, matriz de ArrayList. Pruébalo para entender cómo funciona.
import java.util.*;publicclassArrayOfArrayList{publicstaticvoid main(String[] args){// Put the length of the array you needArrayList<String>[] group =newArrayList[15];for(int x =0; x < group.length; x++){
group[x]=newArrayList<>();}//Add some thing to first array
group[0].add("Some");
group[0].add("Code");//Add some thing to Secondarray
group[1].add("In here");//Try to output 'emSystem.out.println(group[0]);System.out.println(group[1]);}}
El problema con esta situación es mediante el uso de una lista de matrices que obtiene una complejidad de tiempo de o (n) para agregar en una posición específica. Si usa una matriz, crea una ubicación de memoria declarando su matriz, por lo tanto, es constante
Para declarar una matriz de ArrayLists estáticamente para, por ejemplo, posiciones de sprites como Puntos:
ArrayList<Point>[] positionList =newArrayList[2];publicMain(---){
positionList[0]=newArrayList<Point>();// Important, or you will get a NullPointerException at runtime
positionList[1]=newArrayList<Point>();}
dinamicamente:
ArrayList<Point>[] positionList;int numberOfLists;publicMain(---){
numberOfLists =2;
positionList =newArrayList[numberOfLists];for(int i =0; i < numberOfLists; i++){
positionList[i]=newArrayList<Point>();}}
A pesar de las precauciones y algunas sugerencias complejas aquí, he encontrado que un conjunto de ArrayLists es una solución elegante para representar ArrayLists relacionadas del mismo tipo.
l.lengthno está definido en el bucle for. Esto podría ser un error de tiempo de ejecución.
bourbaki4481472
Si no se inicializa para tener una longitud, sigue siendo un puntero nulo cuando alcanza el bucle for. es decir, Lista <e> [] l = nueva Lista [LONGITUD];
Respuestas:
Según la documentación de Oracle :
En cambio, podrías hacer:
Según lo sugerido por Tom Hawting - tackline, es aún mejor hacer:
fuente
List<List<Individual>> group = new ArrayList<List<Individual>>();
Probablemente sería mejor.Como los otros han mencionado, probablemente sea mejor usar otra lista para almacenar ArrayList, pero si tiene que usar una matriz:
fuente
ArrayList<String>[] group = new ArrayList[4]
)? ¿Qué bien extra hace el elenco?new ArrayList<?>[N]
para evitar el uso de un tipo sin formato.Esto funciona:
fuente
ArrayList<String>
lugar deArrayList<NotString>
)group
Note: hello.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
Puede crear una clase que extienda ArrayList
y luego crea la matriz
fuente
No lo entiendo totalmente, por qué todo el mundo sugiere el tipo genérico sobre la matriz, especialmente para esta pregunta.
¿Qué pasa si mi necesidad es indexar
n
diferentes listas de matrices?Con la declaración
List<List<Integer>>
, necesito crearn
ArrayList<Integer>
objetos manualmente o poner un bucle for para crearn
listas o de alguna otra manera, de cualquier manera siempre será mi deber crearn
listas.¿No es genial si lo declaramos a través del casting como
List<Integer>[] = (List<Integer>[]) new List<?>[somenumber]
. Lo veo como un buen diseño donde uno no tiene que crear todos los objetos de indexación (listas de matriz) por sí mismo¿Alguien puede aclararme por qué esta (forma de matriz) será un mal diseño y cuáles son sus desventajas?
fuente
Puedes crear Array of ArrayList
Esto será útil en escenarios como este. Sabes el tamaño del exterior. Pero el tamaño de los interiores varía. Aquí puede crear una matriz de longitud fija que contenga listas de matrices de tamaño variable. Espero que esto sea útil para ti.
En Java 8 y superior puedes hacerlo de una manera mucho mejor.
Aún mejor usando la referencia del método
fuente
ArrayList::new
, llamará alArrayList(int)
constructor con el índice actual como argumento: ArrayList (1), ArrayList (2), ArrayList (3), etc. De este modo, terminará con matrices de menor o mayor tamaño, Dependiendo de su uso. Me desalentar a usarlo y en su lugar prefieren el segundo enfoque en el que se llama al constructor sí mismo en su expresión lambda.Esto funciona, matriz de ArrayList. Pruébalo para entender cómo funciona.
Créditos a Kelvincer por algunos de los códigos.
fuente
El problema con esta situación es mediante el uso de una lista de matrices que obtiene una complejidad de tiempo de o (n) para agregar en una posición específica. Si usa una matriz, crea una ubicación de memoria declarando su matriz, por lo tanto, es constante
fuente
No puede crear una matriz de tipo genérico. Crear lista de listas de matrices:
o si REALMENTE necesita una matriz (ADVERTENCIA: ¡mal diseño!):
fuente
Creación e inicialización.
Acceso de escritura
para acceder a elementos de ArrayList interno:
Acceso de lectura
para leer el elemento de matriz i como ArrayList use el tipo de conversión:
para el elemento de matriz i: para leer el elemento ArrayList en el índice j
fuente
List [] listArr = new ArrayList [4];
La línea anterior da una advertencia, pero funciona (es decir, crea Array of ArrayList)
fuente
Para declarar una matriz de ArrayLists estáticamente para, por ejemplo, posiciones de sprites como Puntos:
dinamicamente:
A pesar de las precauciones y algunas sugerencias complejas aquí, he encontrado que un conjunto de ArrayLists es una solución elegante para representar ArrayLists relacionadas del mismo tipo.
fuente
fuente
Puedes crear así
ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];
Debe crear una matriz de tipo no genérico y luego convertirlo en uno genérico.
fuente
ArrayList<Integer>[] graph = new ArrayList[numCourses]
Funciona.fuente
Me parece más fácil de usar ...
fuente
Puedes hacerlo :
// Crear una matriz de tipo ArrayList
// Para cada elemento en la matriz, haga una ArrayList
fuente
fuente
puede crear una Lista [] e inicializarlos para for loop. se compila sin errores:
funciona con arrayList [] l también.
fuente
l.length
no está definido en el bucle for. Esto podría ser un error de tiempo de ejecución.