web-dev-qa-db-fra.com

Meilleur moyen de tirer profit de la collection par index

Quel est le meilleur moyen d'obtenir de la valeur de Java.util.Collection par index?

39
keo

Tu ne devrais pas. Collection évite de parler d'index spécifiquement parce que cela peut ne pas avoir de sens pour une collection spécifique. Par exemple, une List implique une forme de commande, mais pas une Set.

    Collection<String> myCollection = new HashSet<String>();
    myCollection.add("Hello");
    myCollection.add("World");

    for (String elem : myCollection) {
        System.out.println("elem = " + elem);
    }

    System.out.println("myCollection.toArray()[0] = " + myCollection.toArray()[0]);

donne moi:

    elem = World
    elem = Hello
    myCollection.toArray()[0] = World

Tandis que:

    myCollection = new ArrayList<String>();
    myCollection.add("Hello");
    myCollection.add("World");

    for (String elem : myCollection) {
        System.out.println("elem = " + elem);
    }

    System.out.println("myCollection.toArray()[0] = " + myCollection.toArray()[0]);

donne moi:

    elem = Hello
    elem = World
    myCollection.toArray()[0] = Hello

Pourquoi veux-tu faire cela? Ne pourriez-vous pas simplement parcourir la collection?

48
butterchicken

En général, il n’ya pas de bonne façon, car il n’est pas garanti que Collections ait des indices fixes. Oui, vous pouvez les parcourir, ce qui explique comment toArray (et d’autres fonctions) fonctionnent. Mais l'ordre des itérations n'est pas nécessairement résolu et si vous essayez d'indexer dans une collection générale, vous faites probablement quelque chose de mal. Il serait plus logique d'indexer dans un List .

18
Matthew Flaschen

Je suis d'accord avec la réponse de Matthew Flaschen et je voulais juste montrer des exemples d'options pour le cas où vous ne pouvez pas passer à la liste (parce qu'une bibliothèque vous renvoie une collection):

List list = new ArrayList(theCollection);
list.get(5);

Ou

Object[] list2 = theCollection.toArray();
doSomethingWith(list[2]);

Si vous connaissez les génériques, je peux également vous en fournir des échantillons.

Edit: C'est une autre question de savoir quelle est l'intention et la sémantique de la collection d'origine.

17
akarnokd

Je conviens que c'est généralement une mauvaise idée. Cependant, Commons Collections avait une bonne routine pour obtenir la valeur par index si vous devez vraiment:

CollectionUtils.get (collection, index)

10
JodaStephen

Vous devez soit envelopper votre collection dans une liste (new ArrayList(c)), soit utiliser c.toArray() car les collections n'ont aucune notion "d'index" ou "d'ordre".

5
Aaron Digulla

Convertir la collection en tableau à l'aide de la fonction 

Object[] toArray(Object[] a) 
2
Bhushan Bhangale

vous voulez définitivement un List

L’interface List fournit quatre méthodes d’accès positionnel (indexé) aux éléments de la liste. Les listes (comme les tableaux Java) sont basées sur zéro.

Également

Notez que ces opérations peuvent s'exécuter dans le temps proportionnellement à la valeur d'index pour certaines implémentations (la classe LinkedList, par exemple). Ainsi, itérer sur les éléments d'une liste est généralement préférable à l'indexer si l'appelant ne connaît pas le la mise en oeuvre.

Si vous avez besoin de l'index pour modifier votre collection, notez que List fournit un spécial ListIterator qui vous permet d'obtenir l'index:

List<String> names = Arrays.asList("Davide", "Francesco", "Angelocola");
ListIterator<String> i = names.listIterator();

while (i.hasNext()) {
    System.out.format("[%d] %s\n", i.nextIndex(), i.next());
}
1
dfa

Il serait tout aussi pratique de convertir simplement votre collection en liste à chaque mise à jour. Mais si vous initialisez, cela suffira:

for(String i : collectionlist){
    arraylist.add(i);
    whateverIntID = arraylist.indexOf(i);
}

Être ouvert d'esprit.

1
LifesAway

utiliser pour chaque boucle ...

ArrayList<Character> al = new ArrayList<>();    
String input="hello";

for (int i = 0; i < input.length(); i++){
    al.add(input.charAt(i));
}

for (Character ch : al) {               
    System.Out.println(ch);             
}
0
apksatheesh