Ich habe verwendet, LinkedHashMap
weil es wichtig ist, in welcher Reihenfolge die Schlüssel in die Karte eingegeben werden.
Aber jetzt möchte ich den Wert des Schlüssels zuerst (den zuerst eingegebenen Eintrag) oder den letzten erhalten.
Sollte es eine Methode wie first()
und last()
oder so geben?
Benötige ich einen Iterator, um nur den ersten Schlüsseleintrag zu erhalten? Deshalb habe ich verwendet LinkedHashMap
!
Vielen Dank!
java
dictionary
linkedhashmap
maiky
quelle
quelle
Antworten:
Die Semantik von
LinkedHashMap
ist immer noch die einer Karte und nicht die einerLinkedList
. Es behält die Einfügereihenfolge bei, ja, aber das ist eher ein Implementierungsdetail als ein Aspekt seiner Schnittstelle.Der schnellste Weg, um den "ersten" Eintrag zu erhalten, ist immer noch
entrySet().iterator().next()
. Das Abrufen des "letzten" Eintrags ist möglich, erfordert jedoch das Durchlaufen des gesamten Eintragssatzes durch Aufrufen,.next()
bis Sie den letzten erreichen.while (iterator.hasNext()) { lastElement = iterator.next() }
Bearbeiten : Wenn Sie jedoch bereit sind, über die JavaSE-API hinauszugehen, verfügt Apache Commons Collections über eine eigene
LinkedMap
Implementierung, die Methoden wiefirstKey
und enthältlastKey
, die das tun, wonach Sie suchen. Die Schnittstelle ist erheblich umfangreicher.quelle
mylinkedmap.entrySet().iterator().next()
Zeitkomplexität? Ist es O (1)?Können Sie versuchen, etwas zu tun wie (um den letzten Eintrag zu erhalten):
quelle
T last = null ; for( T item : linkedHashMap.values() ) last = item;
Oder etwas ähnliches. Es ist O (N) in der Zeit, aber O (1) im Speicher.Ich weiß, dass ich zu spät gekommen bin, aber ich möchte einige Alternativen anbieten, nicht etwas Außergewöhnliches, sondern einige Fälle, die hier nicht erwähnt wurden. Für den Fall, dass jemand nicht so viel Wert auf Effizienz legt, aber etwas einfacheres möchte (vielleicht den letzten Eingabewert mit einer Codezeile finden), wird dies mit der Einführung von Java 8 erheblich vereinfacht . Ich biete einige nützliche Szenarien.
Der Vollständigkeit halber vergleiche ich diese Alternativen mit der Lösung von Arrays, die bereits in diesem Beitrag von anderen Benutzern erwähnt wurden. Ich fasse alle Fälle zusammen und denke, dass sie nützlich sind (wenn Leistung wichtig ist oder nicht), insbesondere für neue Entwickler, hängt immer von der Frage jedes Problems ab
Mögliche Alternativen
Verwendung der Array-Methode
Ich habe es der vorherigen Antwort entnommen, um die folgenden Vergleiche anzustellen. Diese Lösung gehört @feresr.
Verwendung der ArrayList-Methode
Ähnlich wie bei der ersten Lösung mit etwas anderer Leistung
Methode reduzieren
Diese Methode reduziert die Menge der Elemente, bis das letzte Element des Streams abgerufen wird. Außerdem werden nur deterministische Ergebnisse zurückgegeben
SkipFunction-Methode
Diese Methode erhält das letzte Element des Streams, indem einfach alle Elemente davor übersprungen werden
Iterable Alternative
Hier ist der vollständige Quellcode
Hier ist die Ausgabe mit der Leistung jeder Methode
quelle
LinkedHashMap
Die aktuelle Implementierung (Java 8) verfolgt den Überblick. Wenn die Leistung ein Problem darstellt und / oder die Karte groß ist, können Sie über Reflexion auf dieses Feld zugreifen.Da sich die Implementierung möglicherweise ändert, ist es wahrscheinlich eine gute Idee, auch eine Fallback-Strategie zu haben. Möglicherweise möchten Sie etwas protokollieren, wenn eine Ausnahme ausgelöst wird, damit Sie wissen, dass sich die Implementierung geändert hat.
Es könnte so aussehen:
quelle
ClassCastException
demcatch
nur für den Fall hinzufügen , dass estail
sich nichtEntry
um eine Unterklasse (oder eine zukünftige Implementierung) handelt.Eine weitere Möglichkeit, den ersten und letzten Eintrag einer LinkedHashMap zu erhalten, ist die Verwendung der "toArray" -Methode der Set-Schnittstelle.
Ich denke jedoch, dass es besser ist, die Einträge im Eintragssatz zu durchlaufen und den ersten und letzten Eintrag zu erhalten.
Die Verwendung von Array-Methoden führt zu einer Warnung des Formulars "... muss deaktiviert konvertiert werden, um ... zu entsprechen." das nicht behoben werden kann [sondern nur durch Verwendung der Anmerkung @SuppressWarnings ("nicht aktiviert") unterdrückt werden kann].
Hier ist ein kleines Beispiel, um die Verwendung der "toArray" -Methode zu demonstrieren:
quelle
Es ist ein bisschen schmutzig, aber Sie können die
removeEldestEntry
Methode von LinkedHashMap überschreiben, die Sie möglicherweise als privates anonymes Mitglied verwenden:So erhalten Sie immer den ersten Eintrag bei Ihrem
eldest
Mitglied. Es wird jedes Mal aktualisiert, wenn Sie eineput
.Es sollte auch leicht zu überschreiben
put
und einzustellen seinyoungest
...Alles bricht zusammen, wenn Sie Einträge entfernen. Ich habe keinen Weg gefunden, das zu klären.
Es ist sehr ärgerlich, dass man sonst nicht auf vernünftige Weise Zugang zu Kopf oder Schwanz bekommt ...
quelle
Vielleicht so etwas:
quelle
Vorschlag:
quelle
Ich würde empfehlen, ConcurrentSkipListMap zu verwenden, die
firstKey()
undlastKey()
Methoden hatquelle
Verwenden Sie für das erste Element
entrySet().iterator().next()
und beenden Sie die Iteration nach 1 Iteration. Zum Schluss ist es am einfachsten, den Schlüssel in einer Variablen beizubehalten, wenn Sie eine map.put ausführen.quelle
Obwohl linkedHashMap keine Methode bietet, um das erste, letzte oder bestimmte Objekt abzurufen.
Aber es ist ziemlich trivial zu bekommen:
Setze al = orderMap.keySet ();
jetzt Iterator für alle Objekte verwenden; Sie können jedes Objekt bekommen.
quelle
Ja, ich bin auf das gleiche Problem gestoßen, aber zum Glück brauche ich nur das erste Element ... - Das habe ich dafür getan.
Wenn Sie auch das letzte Element benötigen - ich würde untersuchen, wie Sie die Reihenfolge Ihrer Karte umkehren können -, speichern Sie es in einer temporären Variablen, greifen Sie auf das erste Element in der umgekehrten Karte zu (daher wäre es Ihr letztes Element), töten Sie das Temp-Variable.
Hier sind einige gute Antworten zum Umkehren der Reihenfolge einer Hashmap:
So iterieren Sie Hashmap in Java in umgekehrter Reihenfolge
Wenn Sie die Hilfe über den obigen Link verwenden, geben Sie ihnen bitte Up-Votes :) Ich hoffe, dies kann jemandem helfen.
quelle
Richtig, Sie müssen den Keyset bis zum Ende der verknüpften Liste manuell auflisten, dann den Eintrag per Schlüssel abrufen und diesen Eintrag zurückgeben.
quelle
quelle