Ich möchte eine Karte mit doppelten Schlüsseln haben.
Ich weiß, dass es viele Kartenimplementierungen gibt (Eclipse zeigt mir ungefähr 50), also wette ich, dass es eine geben muss, die dies zulässt. Ich weiß, dass es einfach ist, eine eigene Karte zu schreiben, die dies tut, aber ich würde lieber eine vorhandene Lösung verwenden.
Vielleicht etwas in Commons-Sammlungen oder Google-Sammlungen?
java
duplicates
guava
multimap
IAdapter
quelle
quelle
Antworten:
Sie suchen nach einer Multimap, und tatsächlich haben sowohl Commons-Sammlungen als auch Guava mehrere Implementierungen dafür. Multimaps ermöglichen mehrere Schlüssel, indem eine Sammlung von Werten pro Schlüssel verwaltet wird. Sie können also ein einzelnes Objekt in die Karte einfügen, aber eine Sammlung abrufen.
Wenn Sie Java 5 verwenden können, würde ich Guavas bevorzugen,
Multimap
da es generika-fähig ist.quelle
com.google.common.collect.HashMultimap
hatreadObject
/writeObject
Methoden, ebenso wie ArrayListMultimap und Immutable {List, Set} Multimap. Ich würde eine nutzlose deserialisierte Instanz als einen Fehler betrachten, der es wert ist, gemeldet zu werden.Wir müssen uns nicht auf die externe Bibliothek von Google Collections verlassen. Sie können einfach die folgende Map implementieren:
Bitte stellen Sie sicher, dass Sie den Code fein einstellen.
quelle
Ausgabe ist:
Hinweis: Wir müssen Bibliotheksdateien importieren.
http://www.java2s.com/Code/Jar/g/Downloadgooglecollectionsjar.htm
oder https://commons.apache.org/proper/commons-collections/download_collections.cgi
quelle
Sie könnten einfach ein Array von Werten für den Wert in einer regulären HashMap übergeben und so doppelte Schlüssel simulieren. Es liegt an Ihnen, zu entscheiden, welche Daten verwendet werden sollen.
Sie können auch einfach eine MultiMap verwenden , obwohl mir die Idee, Schlüssel selbst zu duplizieren, nicht gefällt.
quelle
TreeMap<String, ArrayList<MyClass>>
gelöst meine doppelten Schlüsselanforderungen.Wenn Sie eine Liste von Schlüssel-Wert-Paaren durchlaufen möchten (wie Sie im Kommentar geschrieben haben), sollte eine Liste oder ein Array besser sein. Kombinieren Sie zuerst Ihre Schlüssel und Werte:
Ersetzen Sie Klasse1 und Klasse2 durch die Typen, die Sie für Schlüssel und Werte verwenden möchten.
Jetzt können Sie sie in ein Array oder eine Liste einfügen und sie durchlaufen:
quelle
Dieses Problem kann mit einer Liste von Karteneinträgen gelöst werden
List<Map.Entry<K,V>>
. Wir müssen weder externe Bibliotheken noch eine neue Implementierung von Map verwenden. Ein Karteneintrag kann folgendermaßen erstellt werden:Map.Entry<String, Integer> entry = new AbstractMap.SimpleEntry<String, Integer>("key", 1);
quelle
quelle
Lerne aus meinen Fehlern ... bitte implementiere dies nicht alleine. Guave Multimap ist der richtige Weg.
Eine häufige Verbesserung, die in Multimaps erforderlich ist, besteht darin, doppelte Schlüssel-Wert-Paare nicht zuzulassen.
Das Implementieren / Ändern dieser in Ihrer Implementierung kann ärgerlich sein.
In Guave ist es so einfach wie:
quelle
Ich hatte eine etwas andere Variante dieses Problems: Es war erforderlich, zwei verschiedene Werte mit demselben Schlüssel zu verknüpfen. Wenn ich es hier poste, falls es anderen hilft, habe ich eine HashMap als Wert eingeführt:
Im obigen Code wird die Schlüssel-FrameID aus der ersten Zeichenfolge einer Eingabedatei in jeder Zeile gelesen. Der Wert für frameTypeHash wird durch Aufteilen der verbleibenden Zeile erstellt und ursprünglich als Zeichenfolgenobjekt gespeichert. Über einen Zeitraum hinweg begann die Datei mit mehreren Zeilen ( mit unterschiedlichen Werten), die demselben frameID-Schlüssel zugeordnet sind, sodass frameTypeHash mit der letzten Zeile als Wert überschrieben wurde. Ich habe das String-Objekt durch ein anderes HashMap-Objekt als Wertefeld ersetzt. Dies hat dazu beigetragen, einen einzelnen Schlüssel für eine andere Wertzuordnung beizubehalten.
quelle
Keine ausgefallenen Bibliotheken erforderlich. Karten werden durch einen eindeutigen Schlüssel definiert. Biegen Sie sie also nicht, sondern verwenden Sie eine Liste. Streams sind mächtig.
Und das ist es. Anwendungsbeispiele:
quelle
quelle
Java-Map-Duplicate-Keys
quelle
Was ist mit einem solchen MultiMap-Gerät?
quelle
Können Sie auch den Kontext erläutern, für den Sie versuchen, eine Karte mit doppelten Schlüsseln zu implementieren? Ich bin sicher, es könnte eine bessere Lösung geben. Karten sollen aus gutem Grund eindeutige Schlüssel behalten. Aber wenn du es wirklich tun wolltest; Sie können die Klasse jederzeit erweitern und eine einfache benutzerdefinierte Kartenklasse schreiben, die über eine Kollisionsminderungsfunktion verfügt und es Ihnen ermöglicht, mehrere Einträge mit denselben Schlüsseln zu behalten.
Hinweis: Sie müssen die Kollisionsminderungsfunktion so implementieren, dass kollidierende Schlüssel "immer" in einen eindeutigen Satz konvertiert werden. Etwas Einfaches wie das Anhängen eines Schlüssels mit dem Objekt-Hashcode oder so?
quelle
Um vollständig zu sein, verfügt Apache Commons Collections auch über eine MultiMap . Der Nachteil ist natürlich, dass Apache Commons keine Generika verwendet.
quelle
Mit ein bisschen Hack können Sie HashSet mit doppelten Schlüsseln verwenden. WARNUNG: Dies hängt stark von der Implementierung von HashSet ab.
quelle
Wenn doppelte Schlüssel vorhanden sind, kann ein Schlüssel mehr als einem Wert entsprechen. Die naheliegende Lösung besteht darin, den Schlüssel einer Liste dieser Werte zuzuordnen.
Zum Beispiel in Python:
quelle
Ich habe das benutzt:
java.util.List<java.util.Map.Entry<String,Integer>> pairList= new java.util.ArrayList<>();
quelle