Ich verwende TreeBidiMap
aus der Apache Collections- Bibliothek. Ich möchte dies nach den Werten sortieren, die sind doubles
.
Meine Methode besteht darin, einen Collection
der Werte abzurufen , indem ich:
Collection coll = themap.values();
Was natürlich gut funktioniert.
Haupt Frage: Ich möchte jetzt wissen , wie ich umwandeln kann / cast (nicht sicher , was richtig ist) coll
in ein List
so es sortiert werden können?
Ich beabsichtige dann, über das sortierte List
Objekt zu iterieren , das in Ordnung sein sollte, und die entsprechenden Schlüssel von TreeBidiMap
( themap
) zu erhalten, indem themap.getKey(iterator.next())
ich verwende, wo sich der Iterator über der Liste von befindet doubles
.
TreeBidiMap
ist eineOrderedMap
, die Bestellung sollte ok sein. Die in der Frage erforderliche Sortierung erfolgt nach Werten, nicht nach Schlüsseln.Antworten:
Wie Erel Segal Halevi weiter unten sagt, können Sie Schritt eins überspringen, wenn coll bereits eine Liste ist. Dies würde jedoch von den Interna von TreeBidiMap abhängen.
quelle
So etwas sollte funktionieren und den ArrayList-Konstruktor aufrufen, der eine Sammlung akzeptiert :
quelle
Ich denke, Paul Tomblins Antwort kann verschwenderisch sein, falls coll bereits eine Liste ist, da dadurch eine neue Liste erstellt und alle Elemente kopiert werden. Wenn coll viele Elemente enthält, kann dies lange dauern.
Mein Vorschlag ist:
quelle
Ich glaube, Sie können es als solches schreiben:
quelle
quelle
@ Kunigami: Ich denke, Sie können sich über Guavas
newArrayList
Methode irren . Es wird nicht geprüft, ob es sich bei der Iterable um einen Listentyp handelt, und es wird einfach die angegebene Liste unverändert zurückgegeben. Es wird immer eine neue Liste erstellt:quelle
Was Sie anfordern, ist eine ziemlich kostspielige Operation. Stellen Sie sicher, dass Sie dies nicht oft tun müssen (z. B. in einem Zyklus).
Andernfalls können Sie eine benutzerdefinierte Sammlung erstellen. Ich habe mir eine ausgedacht, die deine
TreeBidiMap
undTreeMultiset
unter der Haube hat. Implementieren Sie nur das, was Sie benötigen, und achten Sie auf die Datenintegrität.Auf diese Weise haben Sie eine sortierte
Multiset
Rückgabe vonvalues()
. Wenn Sie jedoch eine Liste benötigen (z. B. die Array-ähnlicheget(index)
Methode), müssen Sie etwas Komplexeres erfinden.quelle
keySet()
undvalues()
sind Ansichten zum OriginalMap
. Wenn sie also geändert werden, muss auch der HintergrundMap
geändert werden. Ihre Lösung unterstützt dies nichtHier ist eine suboptimale Lösung als Einzeiler:
quelle