Comment convertir une collection en liste?

J’utilise TreeBidiMap de la bibliothèque Apache Collections . Je veux sortinger les valeurs qui sont doubles .

Ma méthode consiste à récupérer un Collection des valeurs en utilisant:

 Collection coll = themap.values(); 

Ce qui fonctionne naturellement bien.

Question principale: Je veux maintenant savoir comment je peux convertir / convertir (je ne suis pas sûr de ce qui est correct) dans une List pour pouvoir la sortinger?

J’ai alors l’intention de parcourir l’object List sortingé, qui devrait être en ordre et d’obtenir les clés appropriées du TreeBidiMap ( themap ) en utilisant themap.getKey(iterator.next()) où l’iterator sera sur la liste des doubles .

 List list = new ArrayList(coll); Collections.sort(list); 

Comme Erel Segal Halevi l’indique ci-dessous, si coll est déjà une liste, vous pouvez ignorer la première étape. Mais cela dépendrait de l’intérieur de TreeBidiMap.

 List list; if (coll instanceof List) list = (List)coll; else list = new ArrayList(coll); 

Quelque chose comme cela devrait fonctionner, en appelant le constructeur ArrayList qui prend une collection:

 List theList = new ArrayList(coll); 

Je pense que la réponse de Paul Tomblin peut être un gaspillage si coll est déjà une liste, car cela créera une nouvelle liste et copiera tous les éléments. Si coll contient de nombreux éléments, cela peut prendre beaucoup de temps.

Ma suggestion est:

 List list; if (coll instanceof List) list = (List)coll; else list = new ArrayList(coll); Collections.sort(list); 

Je crois que vous pouvez l’écrire en tant que tel:

 coll.stream().collect(Collectors.toList()) 
 Collections.sort( new ArrayList( coll ) ); 

@Kunigami: Je pense que vous pouvez vous tromper sur la méthode newArrayList de Guava. Il ne vérifie pas si Iterable est un type List et renvoie simplement la liste donnée telle quelle. Il crée toujours une nouvelle liste:

 @GwtCompatible(serializable = true) public static  ArrayList newArrayList(Iterable elements) { checkNotNull(elements); // for GWT // Let ArrayList's sizing logic work, if possible return (elements instanceof Collection) ? new ArrayList(Collections2.cast(elements)) : newArrayList(elements.iterator()); } 

Ce que vous demandez est une opération coûteuse, assurez-vous de ne pas avoir à le faire souvent (par exemple, dans un cycle).

Sinon, vous pouvez créer une collection personnalisée. Je suis venu avec un qui a votre TreeBidiMap et TreeMultiset sous le capot. Implémentez uniquement ce dont vous avez besoin et respectez l’intégrité des données.

 class MyCustomCollection implements Map { TreeBidiMap map; TreeMultiset multiset; public V put(K key, V value) { removeValue(map.put(key, value)); multiset.add(value); } public boolean remove(K key) { removeValue(map.remove(key)); } /** removes value that was removed/replaced in map */ private removeValue(V value) { if (value != null) { multiset.remove(value); } } public Set keySet() { return map.keySet(); } public Multiset values() { return multiset; } // many more methods to be implemented, eg count, isEmpty etc. } 

De cette façon, vous avez un Multiset sortingé renvoyé par des values() . Cependant, si vous en avez besoin (par exemple, vous avez besoin de la méthode get(index) ), vous devrez inventer quelque chose de plus complexe.

Voici une solution sous-optimale en un trait:

 Collections.list(Collections.enumeration(coll));