Quel est le meilleur moyen d'obtenir de la valeur de Java.util.Collection
par index?
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?
En général, il n’ya pas de bonne façon, car il n’est pas garanti que Collection
s 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 .
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.
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:
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".
Convertir la collection en tableau à l'aide de la fonction
Object[] toArray(Object[] a)
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());
}
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.
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);
}