Crear una matriz de listas de matrices

175

Quiero crear una matriz de arraylist como a continuación:

ArrayList<Individual>[] group = new ArrayList<Individual>()[4]

Pero no está compilando. ¿Cómo puedo hacer esto?

usuario
fuente
8
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?
jimboweb

Respuestas:

142

Según la documentación de Oracle :

"No puede crear matrices de tipos parametrizados"

En cambio, podrías hacer:

ArrayList<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>(4);

Según lo sugerido por Tom Hawting - tackline, es aún mejor hacer:

List<List<Individual>> group = new ArrayList<List<Individual>>(4);
MByD
fuente
20
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>[])new ArrayList[4];
Marcus
fuente
44
Nadie parece explicar bien por qué y me gusta tu fragmento de arriba. ¿Por qué recomienda usar la lista sobre esto?
clankill3r
3
Si el grupo de matriz no cambia, entonces este enfoque es mejor, porque las matrices son más rápidas que las clases List <>.
Borzh
33
Gracias por responder la pregunta. No hay ninguna razón lógica para suponer automáticamente que una lista es preferible a una matriz sin más contexto.
Salsa especial
3
¿Alguna razón por la que esto sería preferible a @kelvincer Answer ( ArrayList<String>[] group = new ArrayList[4])? ¿Qué bien extra hace el elenco?
cellepo
2
Debe usar new ArrayList<?>[N]para evitar el uso de un tipo sin formato.
Radiodef
80

Esto funciona:

ArrayList<String>[] group = new ArrayList[4];
Kelvincer
fuente
1
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.
matemáticas
24

Puede crear una clase que extienda ArrayList

class IndividualList extends ArrayList<Individual> {

}

y luego crea la matriz

IndividualList[] group = new IndividualList[10];
usuario2558221
fuente
17

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 n ArrayList<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?

smslce
fuente
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 = new List[number];
for (int i = 0; i < number; i++) {
    outer[i] = new 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.

List<Integer>[] outer = new List[number];
Arrays.setAll(outer, element -> new ArrayList<>());

Aún mejor usando la referencia del método

List<Integer>[] outer = new List[10];
Arrays.setAll(outer,  ArrayList :: new);
Arjun Nagathankandy
fuente
2
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.*;

public class ArrayOfArrayList {
    public static void main(String[] args) {

        // Put the length of the array you need
        ArrayList<String>[] group = new ArrayList[15];
        for (int x = 0; x < group.length; x++) {
            group[x] = new ArrayList<>();
        }

        //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 'em
        System.out.println(group[0]);
        System.out.println(group[1]);
    }
}

Créditos a Kelvincer por algunos de los códigos.

Rico
fuente
6

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

Mark Odey
fuente
Agregar en una posición específica es O (n) tanto para la matriz como para ArrayList. El relleno también es O (n) para ambas matrices y ArrayList.
Navin
2
Agregar en una posición específica es O (1) para matrices. Es O (n) para ArrayList, pero O (1) para matrices.
aviemet
3

No puede crear una matriz de tipo genérico. Crear lista de listas de matrices:

 List<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>();

o si REALMENTE necesita una matriz (ADVERTENCIA: ¡mal diseño!):

 ArrayList[] group = new ArrayList[4];
Piotr Gwiazda
fuente
2
  1. Creación e inicialización.

    Object[] yourArray = new Object[ARRAY_LENGTH];
  2. Acceso de escritura

    yourArray[i]= someArrayList;

    para acceder a elementos de ArrayList interno:

    ((ArrayList<YourType>) yourArray[i]).add(elementOfYourType); //or other method
  3. Acceso de lectura

    para leer el elemento de matriz i como ArrayList use el tipo de conversión:

    someElement= (ArrayList<YourType>) yourArray[i];

    para el elemento de matriz i: para leer el elemento ArrayList en el índice j

    arrayListElement= ((ArrayList<YourType>) yourArray[i]).get(j);
Amr Lotfy
fuente
2

List [] listArr = new ArrayList [4];

La línea anterior da una advertencia, pero funciona (es decir, crea Array of ArrayList)

Ashutosh S
fuente
1

Para declarar una matriz de ArrayLists estáticamente para, por ejemplo, posiciones de sprites como Puntos:

ArrayList<Point>[] positionList = new ArrayList[2];

public Main(---) {
    positionList[0] = new ArrayList<Point>(); // Important, or you will get a NullPointerException at runtime
    positionList[1] = new ArrayList<Point>();
}

dinamicamente:

ArrayList<Point>[] positionList;
int numberOfLists;

public Main(---) {
    numberOfLists = 2;
    positionList = new ArrayList[numberOfLists];
    for(int i = 0; i < numberOfLists; i++) {
        positionList[i] = new ArrayList<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.

Androidcoder
fuente
1
ArrayList<String>[] lists = (ArrayList<String>[])new ArrayList[10]; 
Labeo
fuente
1

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.

Tejendra
fuente
1

ArrayList<Integer>[] graph = new ArrayList[numCourses] Funciona.

xiankun zhu
fuente
0

Me parece más fácil de usar ...

static ArrayList<Individual> group[];
......
void initializeGroup(int size)
{
 group=new ArrayList[size];
 for(int i=0;i<size;i++)
 {
  group[i]=new ArrayList<Individual>();
 }
Creative_Cimmons
fuente
0

Puedes hacerlo :

// Crear una matriz de tipo ArrayList

`ArrayList<Integer>[] a = new ArrayList[n];`

// Para cada elemento en la matriz, haga una ArrayList

for(int i=0; i<n; i++){ 
    a[i] = new ArrayList<Integer>();
}
Nishant Salhotra
fuente
0
ArrayList<String> al[] = new ArrayList[n+1];
for(int i = 0;i<n;i++){
   al[i] = new ArrayList<String>();
}
Cabeza y cola
fuente
-1

puede crear una Lista [] e inicializarlos para for loop. se compila sin errores:

List<e>[] l;
for(int i = 0; i < l.length; i++){
    l[i] = new ArrayList<e>();
}

funciona con arrayList [] l también.

usuario3539906
fuente
2
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];
Erik