Créer un tableau de tableaux


175

Je souhaite créer un tableau d'arraylist comme ci-dessous:

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

Mais ce n'est pas une compilation. Comment puis-je faire ceci?


8
Ne mélangez pas les tableaux et les collections. En fait, n'utilisez pas de tableaux sauf si vous avez affaire à des primitives (ou si vous savez ce que vous faites). Les tableaux sont un cauchemar d'utilisabilité, ils rendent votre code non maintenable.
Sean Patrick Floyd

13
@SeanPatrickFloyd Pouvez-vous expliquer pourquoi les tableaux sont un cauchemar d'utilisabilité?
utilisateur

3
@crucifiedsoul sûr. un tableau ne peut pas grandir, vous ne pouvez rien insérer dans un tableau, un tableau ne remplace pas les méthodes standard comme equals hashcode ou toString etc.
Sean Patrick Floyd

9
@SeanPatrickFloyd d'accord - eh bien j'ai besoin d'exactement quatre arraylists - je prévois d'accéder à chacun par index - je n'ai pas besoin du tableau externe pour grandir ou se réduire - je n'ai besoin d'aucun toString ou hashcode, etc. - - pour moi, un tableau est le choix évident ici - que recommanderiez-vous comme alternative dans cette situation?
BrainSlugs83

4
D'accord, c'est une vieille question mais je vais quand même la poser et voir si quelqu'un y répond. Je vois tout le monde parler des raisons pour lesquelles un tableau de listes est une idée terrible, une mauvaise pratique de codage, etc. J'ai recherché cela parce que j'apprends à faire des chaînes de hachage, et la définition d'une chaîne de hachage est un tableau de listes! Alors, comment une structure de données de programmation centrale peut-elle être une pratique de codage terrible? Ou cela relève-t-il simplement de la catégorie IYKWYD mentionnée par @Sean?
jimboweb

Réponses:


142

Selon la documentation Oracle :

"Vous ne pouvez pas créer de tableaux de types paramétrés"

Au lieu de cela, vous pouvez faire:

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

Comme suggéré par Tom Hawting - Tackline, il est encore mieux de faire:

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

20
List<List<Individual>> group = new ArrayList<List<Individual>>();serait probablement mieux.
Tom Hawtin - tackline

4
Que signifie «impossible de créer un tableau de type générique»? Cela n'a pas vraiment de sens pour moi parce que ce n'est pas un générique si vous fournissez ce qu'il est censé contenir, non?
Andy

5
Je suis surpris des votes positifs car il ne répond pas à la question (c'est-à-dire que je veux faire cela, comment puis-je le faire). Sauf peut-être pour la 1ère phrase.
Florian F

15
Pourquoi la référence de liste est-elle meilleure que ArrayList?
shifu

3
@shifu une référence List est plus générale que ArrayList; déclarer comme List fait abstraction de l'API d'ArrayList qui s'étend au-delà de l'API List. C'est bien car cela simplifie la référence à List dont l'API a probablement l'intégralité de ce pour quoi la List est nécessaire de toute façon, sans encombrer l'API de cette référence avec les extras qu'ArrayList a. Vous ne devez déclarer comme ArrayList que si vous avez besoin que quelque chose de spécifique de son API soit disponible via la référence.
cellepo

98

Comme les autres l'ont mentionné, il est probablement préférable d'utiliser une autre liste pour stocker l'ArrayList, mais si vous devez utiliser un tableau:

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

4
Personne ne semble bien expliquer pourquoi et j'aime votre extrait ci-dessus. pourquoi recommandez-vous d'utiliser la liste à ce sujet?
clankill3r

3
Si le groupe de tableaux ne change pas, cette approche est meilleure, car les tableaux sont plus rapides que les classes List <>.
Borzh

33
Merci d'avoir répondu à la question. Il n'y a aucune raison logique de présumer automatiquement qu'une liste est préférable à un tableau sans autre contexte.
Sauce spéciale

3
Une raison pour laquelle cela serait préférable à @kelvincer Answer ( ArrayList<String>[] group = new ArrayList[4])? Que font les acteurs de plus de bien?
cellepo

2
Vous devez utiliser new ArrayList<?>[N]pour éviter d'utiliser un type brut.
Radiodef

80

Cela marche:

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

1
Cela a l'avantage souhaité que l'ajout d'une ArrayList de n'importe quel objet en plus de String (c'est-à-dire: ArrayList<String>au lieu de ArrayList<NotString>) à groupne compile pas
cellepo

12
Cela produit un avertissement:Note: hello.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
math

24

Vous pouvez créer une classe étendant ArrayList

class IndividualList extends ArrayList<Individual> {

}

puis créez le tableau

IndividualList[] group = new IndividualList[10];

17

Je ne comprends pas du tout, pourquoi tout le monde suggère le type générique sur le tableau en particulier pour cette question.

Et si mon besoin est d'indexer ndifférents arraylists.

Avec la déclaration, List<List<Integer>>je dois créer des n ArrayList<Integer>objets manuellement ou mettre une boucle for pour créer des nlistes ou d'une autre manière, de quelque manière que ce soit, il sera toujours de mon devoir de créer des nlistes.

Est - il pas grand si nous déclarons par coulée comme List<Integer>[] = (List<Integer>[]) new List<?>[somenumber]. Je le vois comme un bon design où il n'est pas nécessaire de créer tous les objets d'indexation (arraylists) par lui-même

Quelqu'un peut-il m'éclairer pourquoi cette (matrice) sera une mauvaise conception et quels sont ses inconvénients?


AFAICT, cela semble être une sorte de mentalité de culte du fret induite par le terrible système de frappe que Java apporte à la table.
BrainSlugs83

@smsIce: Ce n'est pas une mauvaise conception. Le problème est que de nombreux auteurs ne lisent pas la question en entier ou ne la comprennent pas clairement.
testo du

16

Vous pouvez créer un tableau de ArrayList

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

Cela sera utile dans des scénarios comme celui-ci. Vous connaissez la taille de celle extérieure. Mais la taille des intérieurs varie. Ici, vous pouvez créer un tableau de longueur fixe contenant des listes Array de taille variable. J'espère que cela vous sera utile.

En Java 8 et au-dessus, vous pouvez le faire d'une bien meilleure manière.

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

Encore mieux en utilisant la référence de méthode

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

2
Lorsque vous utilisez le ArrayList::new, il appellera le ArrayList(int)constructeur avec l'index actuel comme argument - ArrayList (1), ArrayList (2), ArrayList (3) etc. Ainsi, vous vous retrouverez avec des tableaux sous-dimensionnés ou surdimensionnés, en fonction de votre utilisation. Je découragerais son utilisation et préférerais plutôt la deuxième approche où vous appelez vous-même le constructeur dans votre expression lambda.
Genhis

8

Cela fonctionne, tableau de ArrayList. Essayez-le pour comprendre comment cela fonctionne.

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édits à Kelvincer pour certains codes.


6

Le problème avec cette situation est qu'en utilisant une arraylist, vous obtenez une complexité temporelle de o (n) pour l'ajout à une position spécifique. Si vous utilisez un tableau, vous créez un emplacement mémoire en déclarant votre tableau donc il est constant


L'ajout à une position spécifique est O (n) pour le tableau et ArrayList. Le remplissage est également O (n) pour les deux tableaux et ArrayList.
Navin le

2
L'ajout à une position spécifique est O (1) pour les tableaux. C'est O (n) pour ArrayList, mais O (1) pour les tableaux.
aviemet

3

Vous ne pouvez pas créer de tableau de type générique. Créer une liste de ArrayLists:

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

ou si vous avez VRAIMENT besoin d'un tableau (ATTENTION: mauvaise conception!):

 ArrayList[] group = new ArrayList[4];

2
  1. Création et initialisation

    Object[] yourArray = new Object[ARRAY_LENGTH];
  2. Accès en écriture

    yourArray[i]= someArrayList;

    pour accéder aux éléments de la ArrayList interne:

    ((ArrayList<YourType>) yourArray[i]).add(elementOfYourType); //or other method
  3. Accès en lecture

    pour lire l'élément i du tableau en tant qu'ArrayList, utilisez la conversion de type:

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

    pour l'élément de tableau i: pour lire l'élément ArrayList à l'index j

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

2

List [] listArr = new ArrayList [4];

La ligne ci-dessus donne un avertissement, mais cela fonctionne (c'est-à-dire qu'il crée un tableau de ArrayList)


1

Pour déclarer statiquement un tableau de ArrayLists pour, par exemple, des positions de sprite sous forme de points:

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

dynamiquement:

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

Malgré les mises en garde et quelques suggestions complexes ici, j'ai trouvé qu'un tableau de ArrayLists était une solution élégante pour représenter des ArrayLists liés du même type.


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

1

Vous pouvez créer comme ça ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];

Vous devez créer un tableau de type non générique, puis le convertir en un tableau générique.



0

Je trouve cela plus facile à utiliser ...

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

Tu peux le faire :

// Créer un tableau de type ArrayList

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

// Pour chaque élément du tableau, créez 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

vous pouvez créer une liste [] et les initialiser par une boucle for. il compile sans erreur:

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

il fonctionne également avec arrayList [] l.


2
l.lengthn'est pas défini dans la boucle for. Cela peut être une erreur d'exécution.
bourbaki4481472

l n'est pas initialisé pour avoir une longueur, c'est toujours un pointeur nul lorsqu'il atteint la boucle for. ie List <e> [] l = nouvelle liste [LENGTH];
Erik
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.