2009-06-26 8 views

Répondre

2

Convertir la collection dans un tableau en utilisant la fonction Object [] toArray (Object [] a)

17

En général, il n'y a pas de bonne façon, comme Collection s ne sont pas garantis d'avoir des indices fixes. Oui, vous pouvez itérer à travers eux, ce qui est de savoir comment fonctionner (et d'autres fonctions). Mais l'ordre d'itération n'est pas nécessairement fixe, 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.

46

Vous ne devriez pas. un Collection évite de parler d'index spécifiquement car cela pourrait ne pas avoir de sens pour la collection spécifique. Par exemple, un List implique une certaine forme de commande, mais pas .

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

me donne:

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

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

me donne:

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

Pourquoi voulez-vous faire? Ne pourriez-vous pas simplement parcourir la collection?

+0

Salut @butterchicken, mon cas est que j'utilise un LinkedHashMap où je reçois le keyset (qui est un ensemble ). J'ai trouvé cet article: http://stackoverflow.com/questions/2923856/is-the-order-guaranteed-for-the-return-of-keys-and-values-from-a-linkedhashmap-o que l'ordre dans cet ensemble est garanti. Est-ce que je ne dois toujours pas l'itérer? – jobbert

+1

@jobbert Vous pouvez absolument itérer dessus. Vous obtenez un 'Set' dans ce cas parce que c'est le contrat de l'interface de' Map'. – butterchicken

4

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

14

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

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

Ou

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

Si vous savez ce que génériques est je peux fournir des échantillons pour cela aussi.

Editer: C'est une autre question de savoir quelle est l'intention et la sémantique de la collection originale.

+1

Si la fonction de la bibliothèque renvoie une Collection, je ne pense pas que vous ayez de garantie quant à l'ordre des éléments dans cette collection. Vraisemblablement, l'appel de la bibliothèque renvoie une collection précisément parce qu'elle ne veut pas que vous fassiez ce genre de suppositions? – butterchicken

+0

Bon point. L'OP ne partageait pas assez d'informations sur le type de bibliothèque qu'il utilise. Certaines bibliothèques retournent la collection juste parce que le développeur a lu une bonne pratique pour retourner une super-interface au lieu de l'implémentation concrète. La bibliothèque pourrait juste retourner Iterable s'il n'y avait jamais eu l'intention d'autoriser autre chose que de boucler le résultat (comme dans AXIOM). – akarnokd

1

vous voulez définitivement un List:

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

également

Notez que ces opérations peuvent exécuter dans le temps proportionnel à la valeur de l'indice pour certaines implémentations (la classe LinkedList, par exemple). Ainsi, l'itération sur les éléments d'une liste est généralement préférable à l'indexation à travers celle-ci si l'appelant ne connaît pas l'implémentation .

Si vous avez besoin de l'index afin de modifier votre collection, vous devez noter que la liste fournit un ListIterator spécial qui vous permettent 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

Il serait tout aussi pratique pour convertir simplement votre collection dans une liste chaque fois qu'il met à jour. Mais si vous initialisez, cela suffira:

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

Soyez ouvert d'esprit.

0

utilisation 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) 

} 
Questions connexes