Crea una matrice di arrailisti


175

Voglio creare una matrice di arraylist come di seguito:

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

Ma non si sta compilando. Come posso fare questo?


8
Non mescolare matrici e raccolte. In effetti, non usare le matrici se non hai a che fare con i primitivi (o non sai cosa stai facendo). Le matrici sono un incubo di usabilità, rendono il tuo codice irraggiungibile.
Sean Patrick Floyd,

13
@SeanPatrickFloyd Puoi spiegare perché gli array sono un incubo di usabilità?
utente

3
@crucifiedsoul sicuro. un array non può crescere, non è possibile inserire nulla in un array, un array non sostituisce metodi standard come uguale a hashcode o toString ecc.
Sean Patrick Floyd

9
@SeanPatrickFloyd va bene - beh, ho bisogno esattamente di quattro arraylist - Ho intenzione di accedervi ciascuno per indice - Non ho bisogno che l'array esterno cresca o si restringa - Non ho bisogno di alcun toString o hashcode, ecc. - - per me, un array è la scelta ovvia qui - cosa consiglieresti in alternativa in questa situazione?
BrainSlugs83

4
Ok, questa è una vecchia domanda, ma lo farò comunque e vedrò se qualcuno risponde. Sto vedendo tutti parlare del motivo per cui una serie di liste è un'idea terribile, una cattiva pratica di codifica, ecc. Ho cercato questo perché sto imparando a fare catene di hash e la definizione di una catena di hash è una matrice di liste! Quindi, in che modo una struttura centrale di dati di programmazione può essere una pratica pratica di codifica? O questo rientra nella categoria IYKWYD menzionata da @Sean?
jimboweb,

Risposte:


142

Secondo la documentazione Oracle :

"Non è possibile creare matrici di tipi con parametri"

Invece, potresti fare:

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

Come suggerito da Tom Hawting - tackline, è ancora meglio fare:

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

20
List<List<Individual>> group = new ArrayList<List<Individual>>();sarebbe probabilmente meglio.
Tom Hawtin - tackline il

4
Che cosa significa "impossibile creare un array di tipo generico"? Questo non ha davvero senso per me perché non è un generico se fornisci ciò che suppone di tenere, giusto?
Andy,

5
Sono sorpreso dei voti poiché non risponde alla domanda (cioè voglio farlo, come posso farlo). Tranne forse per la prima frase.
Florian F,

15
perché il riferimento elenco è meglio di ArrayList?
shifu,

3
@shifu un riferimento alla lista è più generale di ArrayList; la dichiarazione come Elenco estrae l'API di ArrayList che si estende oltre l'API List. Ciò è utile perché semplifica il riferimento a List la cui API probabilmente ha in ogni caso l'intero contenuto dell'elenco, senza ingombrare l'API di quel riferimento con gli extra di ArrayList. Dovresti dichiarare come ArrayList solo se hai bisogno di qualcosa di specifico dalla sua API per essere disponibile tramite il riferimento.
cellepo,

98

Come altri hanno già detto, è probabilmente meglio usare un altro elenco per archiviare ArrayList, ma se è necessario utilizzare un array:

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

4
Nessuno sembra spiegare bene perché e mi piace il tuo frammento sopra. perché mi consiglia di utilizzare l'elenco su questo?
clankill3r,

3
Se il gruppo di array non cambia, questo approccio è migliore, poiché gli array sono più veloci delle classi List <>.
Borzh,

33
Grazie per aver effettivamente risposto alla domanda. Non esiste alcun motivo logico per presumere che un elenco sia preferibile a un array senza ulteriore contesto.
Salsa speciale

3
Qualche motivo per cui sarebbe preferibile rispetto a @kelvincer Answer ( ArrayList<String>[] group = new ArrayList[4])? Cosa fa di meglio il cast?
cellepo,

2
È necessario utilizzare new ArrayList<?>[N]per evitare l'utilizzo di un tipo non elaborato.
Radiodef,

80

Questo funziona:

ArrayList<String>[] group = new ArrayList[4];

1
Ciò ha soddisfacentemente il beneficio desiderato che l'aggiunta di una ArrayList di qualsiasi oggetto oltre a String (ovvero: ArrayList<String>invece di ArrayList<NotString>) groupnon viene compilata
cellepo

12
Questo produce un avvertimento:Note: hello.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
matematica

24

È possibile creare una classe che estende ArrayList

class IndividualList extends ArrayList<Individual> {

}

e quindi creare l'array

IndividualList[] group = new IndividualList[10];

17

Non capisco, perché tutti suggeriscono il tipo genico sull'array in particolare per questa domanda.

E se il mio bisogno fosse di indicizzare ndiversi arraylist.

Con la dichiarazione List<List<Integer>>devo creare n ArrayList<Integer>oggetti manualmente o inserire un ciclo for per creare nelenchi o in qualche altro modo, in ogni modo sarà sempre mio dovere creare nelenchi.

Non è fantastico se lo dichiariamo attraverso il casting come List<Integer>[] = (List<Integer>[]) new List<?>[somenumber]. Lo vedo come un buon design in cui non è necessario creare da solo tutti gli oggetti di indicizzazione (array)

Qualcuno può illuminarmi perché questo (arrayform) sarà un cattivo design e quali sono i suoi svantaggi?


AFAICT sembra essere una sorta di mentalità di culto del carico indotta dal terribile sistema di battitura che Java porta sul tavolo.
BrainSlugs83

@smsIce: non è un cattivo design. Il problema è che molti scrittori non leggono l'intera domanda o la comprendono chiaramente.
testo

16

È possibile creare Array of ArrayList

List<Integer>[] outer = new List[number];
for (int i = 0; i < number; i++) {
    outer[i] = new ArrayList<>();
}

Questo sarà utile in scenari come questo. Conosci le dimensioni di quello esterno. Ma le dimensioni di quelle interne variano. Qui è possibile creare un array di lunghezza fissa che contiene elenchi di array di dimensioni variabili. Spero che questo possa esserti utile.

In Java 8 e versioni successive puoi farlo in un modo molto migliore.

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

Ancora meglio usando il metodo di riferimento

List<Integer>[] outer = new List[10];
Arrays.setAll(outer,  ArrayList :: new);

2
Quando usi il ArrayList::new, chiamerai ArrayList(int)contructor con l'indice corrente come argomento - ArrayList (1), ArrayList (2), ArrayList (3) ecc. Quindi, finirai con array sotto-dimensionati o sovradimensionati, a seconda del tuo utilizzo. Vorrei scoraggiare l'utilizzo e invece preferiscono il secondo approccio in cui si chiama il costruttore te nella tua espressione lambda.
Genhis,

8

Questo funziona, array di ArrayList. Provalo per capire come funziona.

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

Crediti a Kelvincer per alcuni dei codici.


6

Il problema con questa situazione è che usando un arraylist si ottiene una complessità temporale di o (n) per l'aggiunta in una posizione specifica. Se si utilizza un array, si crea un percorso di memoria dichiarando l'array, quindi è costante


L'aggiunta in una posizione specifica è O (n) sia per array che per ArrayList. Il riempimento è anche O (n) per entrambi gli array e ArrayList.
Navin

2
L'aggiunta in una posizione specifica è O (1) per le matrici. È O (n) per ArrayList, ma O (1) per array.
aviemet

3

Non è possibile creare array di tipo generico. Crea un elenco di array:

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

o se hai davvero bisogno dell'array (ATTENZIONE: cattiva progettazione!):

 ArrayList[] group = new ArrayList[4];

2
  1. Creazione e inizializzazione

    Object[] yourArray = new Object[ARRAY_LENGTH];
  2. Accesso in scrittura

    yourArray[i]= someArrayList;

    per accedere agli elementi dell'arrayList interno:

    ((ArrayList<YourType>) yourArray[i]).add(elementOfYourType); //or other method
  3. Accesso in lettura

    per leggere l'elemento array i come ArrayList usa il tipo casting:

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

    per elemento array i: per leggere l'elemento ArrayList all'indice j

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

2

List [] listArr = new ArrayList [4];

La riga sopra avvisa, ma funziona (ovvero crea Array of ArrayList)


1

Per dichiarare staticamente un array di ArrayList per, diciamo, scrivere posizioni come Punti:

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

in modo dinamico:

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

Nonostante le precauzioni e alcuni suggerimenti complessi qui, ho trovato una serie di ArrayList come una soluzione elegante per rappresentare ArrayList correlate dello stesso tipo.


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

1

Puoi creare così ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];

Devi creare un array di tipo non generico e quindi inserirlo in uno generico.


1

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


0

Lo trovo più facile da usare ...

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

Puoi farlo :

// Crea una matrice di tipo ArrayList

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

// Per ogni elemento dell'array crea un 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

puoi creare un Elenco [] e inizializzarlo con il ciclo. si compila senza errori:

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

funziona anche con arrayList [] l.


2
l.lengthnon è definito nel for-loop. Questo potrebbe essere un errore di runtime.
bourbaki4481472,

Non è inizializzato per avere una lunghezza, è ancora un puntatore nullo quando raggiunge il ciclo for. cioè Lista <e> [] l = nuova lista [LENGTH];
Erik,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.