Sortieren, Anzeigen<Key, Value> durch Werte
Ich bin relativ neu in Java, und oft feststellen, dass ich brauche zu Sortieren Map<Key, Value>
auf die Werte.
Da die Werte nicht eindeutig sind, finde ich mich mit der Konvertierung der keySet
in eine array
, und Sortieren das array durch array Sortieren mit einem benutzerdefinierte Komparator -, dass Arten, die auf der dem Schlüssel zugeordnete Wert.
Gibt es einen einfacheren Weg?
Eine Karte soll nicht sortiert werden, aber schnell zugegriffen. Objekt gleichen Werte teilen, die der Einschränkung der Karte. Verwenden Sie den Eintrag gesetzt, wie
Ein Fall, wo dies auftreten könnte, wenn wir versuchen, die Verwendung eines Zählers in Java (Map<Object, Integer>). Sortierung nach Anzahl der Fundstellen werden dann einen gemeinsamen Betrieb. Eine Sprache wie Python hat eine eingebaute Zähler-Daten-Struktur. Für eine Alternative Art der Implementierung in Java, hier ist ein Beispiel
Es gibt viele Anwendungsfälle für sortierte Karten, das ist, warum Sie haben TreeMap und ConcurrentSkipListMap im jdk.
List<Map.Entry<...>> list =new LinkedList(map.entrySet())
und Collections.sort ....
es so.Ein Fall, wo dies auftreten könnte, wenn wir versuchen, die Verwendung eines Zählers in Java (Map<Object, Integer>). Sortierung nach Anzahl der Fundstellen werden dann einen gemeinsamen Betrieb. Eine Sprache wie Python hat eine eingebaute Zähler-Daten-Struktur. Für eine Alternative Art der Implementierung in Java, hier ist ein Beispiel
Es gibt viele Anwendungsfälle für sortierte Karten, das ist, warum Sie haben TreeMap und ConcurrentSkipListMap im jdk.
InformationsquelleAutor |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine generic-freundliche version:
Wahr. Das ist der Fall in jeder Sortier-Algorithmus. Ändern Sie den Wert von Knoten in einer Struktur während einer Art schafft unberechenbar (und fast immer schlechte) Ergebnisse.
Ich habe versucht, es in Android und es funktioniert auch. Es ist nicht Plattform-spezifisches problem, wenn man bedenkt Sie sind mit dem Java-6-version. Haben Sie umgesetzt Vergleichbar richtig in Ihrem Wert-Objekt?
Sollte nicht die Java 8 version verwenden
forEachOrdered
stattforEach
, da die docs vonforEach
Staaten: "Das Verhalten dieser operation ist ausdrücklich nicht deterministisch."?Total verarscht, aber gutgeschrieben @CarterPage in den Kommentaren (es wird in einem open-source-Projekt sowieso). Dank so viel.
InformationsquelleAutor
Wichtiger Hinweis:
Dieser code kann brechen in mehrere Wege. Wenn Sie beabsichtigen, verwenden Sie den code bereitgestellt werden, sicher sein, um die Kommentare zu Lesen wie gut zu wissen, die Auswirkungen. Zum Beispiel, die Werte können nicht mehr abgerufen werden, indem Sie Ihre Schlüssel. (
get
gibt immernull
.)Scheint es sehr viel einfacher, als alle vorhergehenden. Die Verwendung einer TreeMap wie folgt:
Ausgabe:
return ((Comparable)base.get(a).compareTo(((Comparable)base.get(b)))
?Nein. In diesem Fall werden alle Tasten, durch den Wert gleich fallengelassen werden (Unterschied zwischen equals und comparion-by-reference). Außerdem: Auch dieser code hat Probleme mit der folgenden Sequenz
map.put("A","1d");map.put("B","1d");map.put("C",67d);map.put("D",99.5d);
Der Komparator verwendet für die treemap ist inkonsistent mit equals (siehe sortMap javadox). Dies bedeutet retireving Elemente aus dem Baum Karte wird nicht funktionieren. sorted_map.get("A"), wird null zurückgegeben. Das heißt, diese Verwendung von treemap ist gebrochen.
Nur für den Fall es ist nicht klar, Leute: diese Lösung wird wahrscheinlich nicht tun, was Sie wollen, wenn Sie mehrere Schlüssel-mapping auf den gleichen Wert-nur einer dieser Tasten erscheint in der sortierten Folge.
Louis Wasserman (ja, einer der Google Guava Jungs), kann man eigentlich nicht mag, die diese Antwort Recht wenig: "Es bricht in mehrere wirklich verwirrend Möglichkeiten, wenn Sie selbst es betrachten lustig. Wenn der backing-Karte ändert, wird es brechen. Wenn mehrere Schlüssel-Karte auf den gleichen Wert, wird es brechen. Wenn Sie aufrufen, bekommen wir einen Schlüssel, der nicht in der Karte sichern, wird es brechen. Wenn Sie nichts tun, überhaupt dazu führen würde, dass eine Suche so etwas auf einem Schlüssel, der nicht in der map-eine Karte.gleich anrufen, containsKey, nichts-es bricht mit wirklich komischen stack-traces." plus.google.com/102216152814616302326/posts/bEQLDK712MJ
InformationsquelleAutor
Java 8 bietet eine neue Antwort: konvertieren der Einträge in einen Strom, und verwenden Sie den Komparator combinators von der Karte.Eintrag:
Damit werden Sie verbrauchen, werden die Einträge sortiert in aufsteigender Reihenfolge von Wert. Wenn Sie möchten, absteigender Wert, einfach umkehren Sie die Komparator:
Wenn die Werte nicht vergleichbar sind, können Sie passieren einen expliziten comparator:
Können Sie dann weiter zu verwenden, andere stream-Operationen zum konsumieren der Daten. Zum Beispiel, wenn Sie wollen, dass die top 10 in einer neuen Karte:
Oder drucken
System.out
:parallelStream()
in diesem Fall ?Es wird parallel arbeiten, allerdings können Sie feststellen, dass die Kosten der Zusammenführung von Karten zu kombinieren, die teilweise Ergebnisse ist zu teuer und die parallele version nicht ausführen können, so gut wie Sie hoffen würde. Aber es funktioniert und produzieren die richtige Antwort.
Vielen Dank für Ihre nützliche Ratschläge. Es war genau das, was ich Frage mich, obwohl es hängt davon ab, welche Art von Schlüssel Sie verwenden, und so viele Parameter... Das wichtigste ist, "es funktioniert und produzieren die richtige Antwort".
Wie kann ich die Sortierung nach den Werten, die Listen mit den verschiedenen Größen? Ich möchte Sortieren nach absteigender Liste Größe.
don' t verwenden Sie compareByValue in die top10 Beispiel?
InformationsquelleAutor
Drei 1-line Antworten...
Ich würde verwenden Sie
die Google-SammlungenGuave, dies zu tun - wenn deine Werte sindComparable
dann können SieErstellen eine Funktion (Objekt) für die Karte [nimmt eine der Tasten, die als Eingabe, Rückkehr der jeweilige Wert], und dann gelten natürlich (vergleichbar) bestellen, um Sie [die Werte].
Wenn Sie nicht vergleichbar ist, dann müssen Sie zu tun, etwas entlang der Linien von
Diese können angewendet werden, um eine TreeMap (wie
Ordering
erstrecktComparator
), oder eine LinkedHashMap nach einiger SortierenNB: Wenn Sie gehen, um eine TreeMap, denken Sie daran, dass, wenn ein Vergleich == 0, dann ist das Element bereits in der Liste (was wird passieren, wenn Sie mehrere Werte haben, die das gleiche vergleichen). Um dies zu beheben, fügen Sie Ihre Schlüssel, um den Komparator so (vorausgesetzt, dass die Schlüssel und Werte sind
Comparable
):= Gelten Natürliche der Bestellung der Wert zugeordnet werden, indem die Taste, und die Verbindung, die mit der natürlichen Reihenfolge der Schlüssel
Beachten Sie, dass dies immer noch nicht funktionieren, wenn Sie Ihre Schlüssel vergleichen zu 0, aber das sollte ausreichend sein für die meisten
comparable
Elemente (wiehashCode
,equals
undcompareTo
sind oft in sync...)Sehen Mit der Bestellung.onResultOf() und Funktionen.forMap().
Umsetzung
So, jetzt haben wir ein Komparator, der das tut, was wir wollen, wir brauchen, um ein Ergebnis zu erhalten.
Nun das wird am ehesten funktionieren, aber:
TreeMap
; es gibt keinen Punkt versucht, zu vergleichen eine eingelegte Schlüssel, wenn es nicht einen Wert haben, bis nach dem setzen, d.h., Sie brechen wirklich schnellPunkt 1 ist ein bisschen ein deal-breaker für mich; google-Kollektionen ist unglaublich faul (was ist gut: man kann so ziemlich jeden Vorgang in einem Augenblick; die eigentliche Arbeit ist getan, wenn Sie beginnen, Verwendung des Ergebnisses), und dies erfordert das kopieren einer ganze Karte!
"Vollständige" Antwort/Live sortiert anzeigen von Werten
Keine Sorge, wenn Sie besessen genug, dass eine "live" - Karte sortiert in dieser Art und Weise, Sie lösen könnte, nicht nur eine, sondern beide(!) der oben genannten Fragen mit so etwas verrücktes wie die folgenden:
Hinweis: Diese hat sich stark verändert, im Juni 2012 - der bisherige code konnte nie arbeiten: eine innere HashMap ist erforderlich, um die lookup-Werte ohne die Schaffung einer unendlichen Schleife zwischen den
TreeMap.get()
->compare()
undcompare()
->get()
Wenn wir uns setzen, stellen wir sicher, dass die hash-Tabelle hat den Wert für den Komparator setzen, und dann das TreeSet für die Sortierung. Aber vorher prüfen wir die hash-map, um zu sehen, dass der Schlüssel ist nicht eigentlich eine doppelte. Auch der Komparator, die wir erstellen, wird auch die Schlüssel, so dass doppelte Werte nicht zu löschen, die nicht duplicate keys (aufgrund der == Vergleich).
Diese 2 Elemente sind vital für die Sicherstellung der Karte Vertrag gehalten; wenn Sie denken, dass Sie das nicht wollen, dann sind Sie fast am Punkt der Umkehr der Karte ganz (zu
Map<V,K>
).Den Konstruktor müsste man als
Ordering
ist einfach eine reicheComparator
. Ich habe versucht das kommentieren jedes Beispiel (Kursiv unter jedem). "Natürliche" zeigt an, dass die ObjekteComparable
; es ist wie der apache-common ComparableComparator.onResultOf
wendet eine Funktion auf das Element verglichen wird. Also, wenn Sie hatte eine Funktion, die addiert 1 zu einem integer, dannnatural().onResultOf(add1Function).compare(1,2)
würde am Ende tut2.compareTo(3)
ImmutableSortedMap.copyOf wirft IllegalArgumentException, wenn es doppelte Werte in der ursprünglichen Karte.
Ja, es wird - Sie sollten in der Lage sein zu verwenden
ImmutableSetMultiMap
oderImmutableListMultiMap
enthalten die Sammlung der doppelten Variablen.Vielen Dank für diese, ich habe Ihre Lösung in einem Projekt. Ich denke, es gibt ein problem in put-obwohl: sich zu Verhalten wie eine Karte, die er zurückgeben muss, der Wert, der vorher im Zusammenhang mit der-Taste, wenn es vorhanden ist, aber so wird es nie tun. Die Lösung, die ich verwendete wieder entfernt Wert, wenn es vorhanden ist.
InformationsquelleAutor
Vom http://www.programmersheaven.com/download/49349/download.aspx
kann nicht konvertieren, die von Iterator zu TernaryTree.Iterator
Ich sage nicht "es ist schlecht zu Sortieren, eine LinkedList", aber das LinkedList selbst ist eine schlechte Wahl hier, unabhängig von der Sortierung. Sehr besser eine ArrayList, und für extra-Punkte, Größe genau anzeigen.Größe(). Siehe auch code.google.com/p/memory-measurer/wiki/... Durchschnittliche Kosten pro element in der ArrayList: 5 bytes Durchschnittliche Kosten pro element in der LinkedList: 24 Byte. Für eine genau dimensionierte ArrayList, die durchschnittlichen Kosten würde 4 bytes. Das ist, LinkedList nimmt SIX - mal die Menge an Arbeitsspeicher, die ArrayList muss. Es ist einfach nur aufblasen
unter Verwendung der obigen Werte wurde in aufsteigender Reihenfolge sortiert. Zum Sortieren in absteigender ?
Ersetzen o1 und o2 zu Sortieren und absteigend Sortieren.
InformationsquelleAutor
Mit Java 8 verwenden, können Sie die streams-api, es zu tun in einer deutlich weniger ausführliche Weise:
eine Lösung gefunden -
Collections.reverseOrder(comparing(Entry::getValue))
Ich glaube, ich sehe einen Tippfehler -- es sollte nicht die "toMap" genannt werden als " Sammler.toMap() " ?
Oder verwenden Sie einen statischen import 🙂
Einen besseren Weg, um zu Sortieren durch den Eintritt Wert in umgekehrter Reihenfolge ist:
Entry.comparingByValue(Comparator.reverseOrder())
InformationsquelleAutor
Sortierung der Schlüssel verlangt, den Komparator, um jedes Wert für jeden Vergleich. Eine besser skalierbare Lösung wäre die entrySet direkt, denn dann wäre der Wert sofort zur Verfügung für jeden Vergleich (obwohl ich noch nicht untermauerte dies durch zahlen).
Hier ist eine generische version von so etwas:
Es gibt Möglichkeiten, zu verringern memory-rotation für die obige Lösung. Die erste ArrayList erstellt, könnte zum Beispiel wieder als return Wert; dies würde erfordern, Unterdrückung von einigen Generika-Warnungen, aber es könnte sich lohnen für re-usable code für die Bibliothek. Auch der Komparator nicht neu alloziert bei jedem Aufruf.
Hier ist ein effizienter, wenn auch weniger Ansprechend version:
Schließlich, wenn Sie brauchen, um ständig Zugriff auf die sortierten Informationen (eher als nur Sortieren, es einmal in eine Weile), können Sie eine zusätzliche multi-Karte. Lassen Sie mich wissen, wenn Sie brauchen mehr details...
InformationsquelleAutor
Commons-collections-Bibliothek enthält eine Lösung namens TreeBidiMap. Oder, Sie könnten einen Blick auf die Google-Collections-API. Es hat TreeMultimap, die Sie nutzen könnten.
Und wenn Sie nicht wollen, verwenden Sie diesen Rahmen... Sie kommen mit source-code.
ja, aber TreeMap ist weit weniger flexibel, wenn die Sortierung nach den Wert Teil des mapentries.
Das Problem mit BidiMap ist, dass es fügt eine 1:1-relation-constraint zwischen Schlüssel und Werte, um die Beziehung invertierbar ist (dh. beide Schlüssel und Werte müssen eindeutig sein). Dies bedeutet, dass Sie nicht verwenden können, diese zu speichern, so etwas wie ein word-count-Objekt, da viele Wörter haben die gleiche Anzahl.
InformationsquelleAutor
Ist, habe ich mich auf die gegebenen Antworten, aber viele von Ihnen sind komplizierter als notwendig, oder entfernen Sie Elemente anzeigen, wenn mehrere Tasten haben den gleichen Wert.
Hier ist eine Lösung, die ich denke passt besser:
Beachten Sie, dass die Karte ist sortiert vom höchsten Wert zum niedrigsten.
Dieser sieht eine saubere Lösung für mich , außer der Tatsache, dass @ErelSegalHalevi darauf hingewiesen , zu überprüfen, ob die Werte vorhanden sind, die in der Karte nicht möglich sein wird, wie Sie angegeben ist der Komparator. Karte.put("1", "Eins"); map.put("2", "Zwei"); anzeigen.put("3", "Drei"); anzeigen.put("4", "Vier"); anzeigen.put("5", "Fünf"); anzeigen.containsKey("1") wird immer false zurückgeben , wenn Sie wieder neues Objekt in der Funktion sortByValues() wie return new TreeMap<K V>(sortedByValues); löst das problem . Dank Abhi
so ziemlich das gleiche wie user157196 und Carter Seite die Antwort. Carter Seite enthält die LinkedHashMap fix
4. Zeile der Lösung sollte int compare = Karte.get(k1).compareTo(Karte anzeigen.get(k2)); wenn Sie brauchen, aufsteigend
InformationsquelleAutor
Dies zu erreichen, mit den neuen features in Java 8:
Die Einträge sind in der Reihenfolge Ihrer Werte mit Hilfe der gegebenen Komparator. Alternativ, wenn deine Werte sind untereinander vergleichbar, keine expliziten comparator benötigt wird:
Der zurückgegebenen Liste ist eine Momentaufnahme der gegebenen Karte zur Zeit wird diese Methode aufgerufen, so wird weder reflektieren nachträgliche änderungen des anderen. Für eine live-iterierbar-Ansicht der Karte:
Den zurückgegebenen durchsuchbar erstellt einen frischen snapshot der angegebenen Karte es ist jedes mal iteriert, so dass abgesehen von der gleichzeitigen änderung, es wird immer wieder der aktuelle Stand der Karte.
InformationsquelleAutor
Erstellen von benutzerdefinierten Komparator und zu verwenden, während die Schaffung neuer TreeMap-Objekt.
Verwenden Sie den folgenden code in der main-func
Ausgabe:
Falls die Werte gleich sind, ich habe die "return 1" - Zeile zu vergleichen mit den Tasten: "return ((String) o1).compareTo((String) o2);"
InformationsquelleAutor
Während ich damit einverstanden, dass die ständige Notwendigkeit, zu Sortieren, eine Karte ist wahrscheinlich ein Geruch, ich denke, der folgende code ist der einfachste Weg, dies zu tun, ohne mit einer anderen Datenstruktur.
}
Und hier ist ein peinlich unvollständige unit-test:
}
Das Ergebnis ist eine sortierte Liste Anzeigen.Eintrag Objekten, aus denen Sie erhalten die Schlüssel und Werte.
Diese Lösung funktioniert nicht mit vielen Werten, verschraubt mit meiner zählt, (der Wert mit jedem Schlüssel)
Das ist merkwürdig. Könnten Sie das näher erläutern? Was war Ihr Ausgang, und was war die Ausgabe, die Sie erwarten?
InformationsquelleAutor
Die Antwort gewählt, die die meisten nicht arbeiten, wenn Sie 2 Elemente, die gleich sind.
die TreeMap Blätter die gleichen Werte aus.
dem Beispiel:
unsortiert anzeigen
Ergebnisse
So lässt sich E!!!!
Für mich ist es funktionierte gut zum einstellen der Komparator, wenn es gleich nicht wieder 0, sondern -1.
im Beispiel:
jetzt kehrt es zurück:
unsortiert anzeigen:
Ergebnisse:
als Antwort auf Aliens (2011 nov. 22):
Ich Bin mit dieser Lösung für eine Karte von Integer-Id ' s und Namen, aber die Idee ist die gleiche, also könnte der code oben ist nicht korrekt (ich Schreibe es in einem test und geben Sie den richtigen code), dies ist der code für eine Karte, Sortierung, basierend auf der Lösung oben:
- und dies ist der test-Klasse (habe es gerade getestet, und das funktioniert für die Integer -, String Map:
hier ist der code für den Komparator der Karte:
- und das ist der Testfall für diese:
natürlich können Sie diese viel mehr generische, aber ich brauchte es für 1 Fall (der Karte)
Sie hatten Recht, es gab einige Fehler in dem code habe ich auf den ersten! ich Hoffe, dass meine letzten Bearbeiten wird Ihnen helfen.
InformationsquelleAutor
Verwenden einen generischen comparator wie :
InformationsquelleAutor
Anstatt
Collections.sort
wie es einige tun ich würde vorschlagen, mitArrays.sort
. Eigentlich das, wasCollections.sort
tut, ist so etwas wie dieses:Es ruft einfach nur
toArray
auf der Liste und dann verwendetArrays.sort
. Auf diese Weise alle map-Einträge kopiert werden drei mal: einmal von der Karte auf die temporäre Liste (LinkedList, oder ArrayList), dann das temporäre array, und schließlich auf die neue Karte.Meine Lösung ommits diesem einen Schritt, wie es nicht zu unnötigen LinkedList. Hier ist der code, generic-freundlich und performance-optimal:
InformationsquelleAutor
Dies ist eine variation von Anthony ' s Antwort, das funktioniert nicht, wenn es doppelte Werte:
Beachten Sie, dass es eher in der Luft zu behandeln, wie null-Werte.
Ein wichtiger Vorteil dieses Ansatzes ist, dass es tatsächlich gibt eine Karte, im Gegensatz zu einigen der anderen Lösungen, die hier angeboten werden.
InformationsquelleAutor
Großes problem. Wenn Sie die erste Antwort (Google findet Sie hier), ändern der Komparator hinzufügen eine gleiche Klausel, sonst können Sie keine Werte aus der sorted_map von Tasten:
InformationsquelleAutor
Beste Ansatz
Ausgabe
InformationsquelleAutor
Gibt es viele Antworten für diese Frage schon, aber keiner gab mir das, was ich suchte, eine Karte die Umsetzung, gibt Schlüssel und Einträge, sortiert nach dem zugeordneten Wert und behält diese Eigenschaft als Schlüssel und die Werte werden geändert in der Karte. Zwei andere Fragen Fragen, die für diese spezifisch.
Kochte ich eine generische freundlich Beispiel, das löst diesen use-case. Diese Umsetzung nicht Ehren alle Verträge, die der Map-Schnittstelle, wie reflektiert-value-änderungen und Umzüge in den sets Rückkehr von keySet() und entrySet() in das ursprüngliche Objekt. Ich fühlte mich wie eine Lösung wäre zu groß, um in einem Stack-Überlauf-Antwort. Wenn ich es Schaffe, um eine vollständige Umsetzung, vielleicht werde ich es auf Github und es dann link in einer aktualisierten version dieser Antwort.
Nicht sicher, ob ich verstehe Ihren Fall, können Sie vielleicht zu aufwendig. Wenn das Objekt, das Sie verwenden möchten, als Wert nicht Vergleichbar ist, dann würden Sie brauchen, um zu konvertieren es zu einem Objekt.
InformationsquelleAutor
Je nach Kontext, mit
java.util.LinkedHashMap<T>
die rememebers die Reihenfolge, in der die Elemente auf der Karte platziert. Andernfalls, wenn Sie brauchen, um zu Sortieren-Werte basierend auf Ihrer natürlichen bestellen, würde ich empfehlen die Verwendung einer separaten Liste, die sortiert werden können, überCollections.sort()
.InformationsquelleAutor
Seit TreeMap<> funktioniert nicht für Werte, die gleich sein werden, habe ich diese:
Möchten Sie vielleicht zu setzen Liste in einem LinkedHashMap, aber wenn Sie nur gehen, Durchlaufen Sie es rechts Weg, das ist überflüssig...
InformationsquelleAutor
Dies ist einfach zu kompliziert. Karten waren eigentlich nicht tun job, wie das Sortieren von Wert. Der einfachste Weg ist das erstellen Ihrer eigenen Klasse, so dass es passt Ihre Anforderungen.
Im unteren Beispiel sollen Sie hinzufügen TreeMap ein Komparator am Ort * ist. Aber von der java-API gibt es Komparator nur die Schlüssel, nicht die Werte. Alle Beispiele, die hier angegeben ist, basierend auf 2 Karten. Einer Hash-und einer neuen Struktur. Das ist seltsam.
Beispiel:
So ändern Sie die Karte in einen Satz auf diese Weise:
Erstellen Sie die Klasse
Results
,und der Komparator-Klasse:
Diese Weise können Sie ganz einfach hinzufügen mehr Abhängigkeiten.
Und als letzten Punkt werde ich einfach iterator:
InformationsquelleAutor
Basierend auf @devinmoore code, eine Karte, Sortier-Methoden, die Verwendung von Generika und unterstützt sowohl aufsteigend und absteigend bestellen.
InformationsquelleAutor
Hier ist eine OO-Lösung (d.h., nicht
static
Methoden):Hiermit gespendet, um die public domain.
InformationsquelleAutor
Afaik die meisten Reiniger Weg ist die Nutzung von Sammlungen zu Sortieren, map Wert:
InformationsquelleAutor
Einige einfache änderungen, um eine sortierte map mit Paaren, die doppelten Wert haben. In der compare-Methode (Klasse ValueComparator), wenn die Werte gleich sind, nicht 0 zurückgeben, sondern das Ergebnis des Vergleichs der 2-Tasten. Die Tasten sind deutlich in eine Karte, damit Sie erfolgreich zu halten doppelte Werte (welche sind sortiert nach Schlüssel). Also das obige Beispiel könnte geändert werden, wie dies:
InformationsquelleAutor
Sicher die Lösung von Stephen ist wirklich toll, aber für diejenigen, die nicht verwenden können, Guave:
Hier ist meine Lösung für die Sortierung nach Wert einer Karte.
Diese Lösung Griff den Fall, wenn es zweimal den gleichen Wert usw...
Exec:
http://www.ideone.com/dq3Lu
Die Ausgabe:
Hoffe, es wird helfen, einige Leute
InformationsquelleAutor
Späten Eintrag.
Mit dem Aufkommen von Java-8, wir verwenden können Datenströme für Daten-manipulation sehr einfach/prägnante Weise. Sie können streams Sortieren Sie die Einträge anzeigen, die von Wert, und erstellen Sie eine LinkedHashMap bewahrt, die insertion-order iteration.
ZB:
Reverse-Bestellung, ersetzen:
mit
Entry.comparingByValue()
(wie assylias Antwort oben stackoverflow.com/a/22132422/1480587) odercomparing(Entry<Key,Value>::getValue).thenComparing(Entry::getKey)
dass Sie verwendet? Ich verstehe Sie auch, vergleichen Schlüssel, wenn die Werte identisch sind, richtig? Ich habe bemerkt, dass das Sortieren behält die Reihenfolge der Elemente mit dem gleichen Wert - so ist das Sortieren von Schlüsseln notwendig, wenn die Schlüssel bereits sortiert vor?InformationsquelleAutor
Wenn Sie haben doppelte Schlüssel und nur eine kleine Menge von Daten (<1000) und der code ist nicht die Leistung entscheidend, können Sie einfach Folgendes tun:
inputUnsortedMap ist die Eingabe für den code.
Die variable sortedOutputMap der die Daten enthält in der absteigenden Reihenfolge bei der Iteration. Zum ändern der Reihenfolge einfach ändern > ein < in die if-Anweisung.
Ist nicht die Schnellste Art aber nicht den job-ohne zusätzliche Abhängigkeiten.
InformationsquelleAutor
Habe ich zusammengeführt, die Lösungen von user157196 und Carter Seite:
InformationsquelleAutor