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?


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);

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];

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];

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];

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?


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);

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.


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


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];

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);

2

List [] listArr = new ArrayList [4];

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


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.


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

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.



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>();
 }

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>();
}

0
ArrayList<String> al[] = new ArrayList[n+1];
for(int i = 0;i<n;i++){
   al[i] = new ArrayList<String>();
}

-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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.