J'utilise TreeBidiMap
de la bibliothèque Apache Collections . Je veux trier cela sur les valeurs qui sont doubles
.
Ma méthode consiste à récupérer une Collection
des valeurs en utilisant:
Collection coll = themap.values();
Ce qui fonctionne naturellement bien.
Question principale: je veux maintenant savoir comment convertir / convertir (je ne sais pas lequel est correct) coll
en un List
afin qu'il puisse être trié?
J'ai ensuite l'intention d'itérer sur l' List
objet trié , qui devrait être en ordre et d'obtenir les clés appropriées de TreeBidiMap
( themap
) en utilisant themap.getKey(iterator.next())
où l'itérateur sera sur la liste de doubles
.
TreeBidiMap
est unOrderedMap
, la commande doit être correcte. Le tri requis dans la question concerne les valeurs, pas les clés.Réponses:
Comme Erel Segal Halevi le dit ci-dessous, si coll est déjà une liste, vous pouvez ignorer la première étape. Mais cela dépendrait des éléments internes de TreeBidiMap.
la source
Quelque chose comme ça devrait fonctionner, en appelant le constructeur ArrayList qui prend une collection:
la source
Je pense que la réponse de Paul Tomblin peut être inutile 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 du temps.
Ma suggestion est:
la source
Je pense que vous pouvez l'écrire comme tel:
la source
la source
@Kunigami: Je pense que vous vous trompez peut-être sur la
newArrayList
méthode de Guava . Il ne vérifie pas si l'itérable est un type de liste et renvoie simplement la liste donnée telle quelle. Il crée toujours une nouvelle liste:la source
Ce que vous demandez est une opération assez coûteuse, assurez-vous que vous n'avez pas besoin de 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
etTreeMultiset
sous le capot. N'implémentez que ce dont vous avez besoin et faites attention à l'intégrité des données.De cette façon, vous avez un tri de
Multiset
retourvalues()
. Cependant, si vous avez besoin que ce soit une liste (par exemple, vous avez besoin de laget(index)
méthode de type tableau ), vous devrez inventer quelque chose de plus complexe.la source
keySet()
etvalues()
sont des vues par rapport à l'originalMap
, donc lorsqu'elles sont modifiées, le supportMap
doit également être modifié, votre solution ne le prend pas en chargeJava 14 introduit
List#copyOf
qui retourne une liste non modifiable tout en préservant l'ordre:la source
Voici une solution sous-optimale en une ligne:
la source