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?
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>[])newArrayList[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.
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.
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 nArrayList<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 =newList[number];for(int i =0; i < number; i++){
outer[i]=newArrayList<>();}
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 =newList[number];Arrays.setAll(outer, element ->newArrayList<>());
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.*;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]);}}
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
Pour déclarer statiquement un tableau de ArrayLists pour, par exemple, des positions de sprite sous forme de points:
ArrayList<Point>[] positionList =newArrayList[2];publicMain(---){
positionList[0]=newArrayList<Point>();// Important, or you will get a NullPointerException at runtime
positionList[1]=newArrayList<Point>();}
dynamiquement:
ArrayList<Point>[] positionList;int numberOfLists;publicMain(---){
numberOfLists =2;
positionList =newArrayList[numberOfLists];for(int i =0; i < numberOfLists; i++){
positionList[i]=newArrayList<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.
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];
Réponses:
Selon la documentation Oracle :
Au lieu de cela, vous pouvez faire:
Comme suggéré par Tom Hawting - Tackline, il est encore mieux de faire:
la source
List<List<Individual>> group = new ArrayList<List<Individual>>();
serait probablement mieux.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:
la source
ArrayList<String>[] group = new ArrayList[4]
)? Que font les acteurs de plus de bien?new ArrayList<?>[N]
pour éviter d'utiliser un type brut.Cela marche:
la source
ArrayList<String>
au lieu deArrayList<NotString>
) àgroup
ne compile pasNote: hello.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
Vous pouvez créer une classe étendant ArrayList
puis créez le tableau
la source
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
n
différents arraylists.Avec la déclaration,
List<List<Integer>>
je dois créer desn
ArrayList<Integer>
objets manuellement ou mettre une boucle for pour créer desn
listes ou d'une autre manière, de quelque manière que ce soit, il sera toujours de mon devoir de créer desn
listes.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êmeQuelqu'un peut-il m'éclairer pourquoi cette (matrice) sera une mauvaise conception et quels sont ses inconvénients?
la source
Vous pouvez créer un tableau de 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.
Encore mieux en utilisant la référence de méthode
la source
ArrayList::new
, il appellera leArrayList(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.Cela fonctionne, tableau de ArrayList. Essayez-le pour comprendre comment cela fonctionne.
Crédits à Kelvincer pour certains codes.
la source
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
la source
Vous ne pouvez pas créer de tableau de type générique. Créer une liste de ArrayLists:
ou si vous avez VRAIMENT besoin d'un tableau (ATTENTION: mauvaise conception!):
la source
Création et initialisation
Accès en écriture
pour accéder aux éléments de la ArrayList interne:
Accès en lecture
pour lire l'élément i du tableau en tant qu'ArrayList, utilisez la conversion de type:
pour l'élément de tableau i: pour lire l'élément ArrayList à l'index j
la source
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)
la source
Pour déclarer statiquement un tableau de ArrayLists pour, par exemple, des positions de sprite sous forme de points:
dynamiquement:
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.
la source
la source
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.
la source
ArrayList<Integer>[] graph = new ArrayList[numCourses]
Ça marche.la source
Je trouve cela plus facile à utiliser ...
la source
Tu peux le faire :
// Créer un tableau de type ArrayList
// Pour chaque élément du tableau, créez un ArrayList
la source
la source
vous pouvez créer une liste [] et les initialiser par une boucle for. il compile sans erreur:
il fonctionne également avec arrayList [] l.
la source
l.length
n'est pas défini dans la boucle for. Cela peut être une erreur d'exécution.