Ist es uns möglich, eine HashMap mit einem Schlüssel und zwei Werten zu implementieren? Genau wie HashMap?
Bitte helfen Sie mir auch, indem Sie (wenn es keine Möglichkeit gibt) eine andere Möglichkeit angeben, die Speicherung von drei Werten mit einem als Schlüssel zu implementieren.
Antworten:
Du könntest:
Map<KeyType, List<ValueType>>
.Map<KeyType, WrapperType>
.Map<KeyType, Tuple<Value1Type, Value2Type>>
.Beispiele
1. Karte mit Liste als Wert
Der Nachteil bei diesem Ansatz ist, dass die Liste nicht an genau zwei Werte gebunden ist.
2. Verwenden der Wrapper-Klasse
Der Nachteil dieses Ansatzes besteht darin, dass Sie für all diese sehr einfachen Containerklassen viel Kesselplattencode schreiben müssen.
3. Verwenden eines Tupels
Dies ist meiner Meinung nach die beste Lösung.
4. Mehrere Karten
Der Nachteil dieser Lösung ist, dass es nicht offensichtlich ist, dass die beiden Karten zusammenhängen. Ein Programmfehler könnte dazu führen, dass die beiden Karten nicht mehr synchron sind.
quelle
Map<KeyType, Tuple<Value1Type, Value2Type>>
Nein, nicht nur als
HashMap
. Grundsätzlich benötigen Sie einenHashMap
Schlüssel von Schlüssel zu einer Sammlung von Werten.Wenn Sie gerne externe Bibliotheken verwenden, hat Guava genau dieses Konzept in
Multimap
Implementierungen wieArrayListMultimap
undHashMultimap
.quelle
ArrayListMultimap
dich selbst bauen ... oder einfach einHashMap<String, List<Integer>>
oder was auch immer verwenden. Grundsätzlich müssen Sie jedes Mal, wenn ein Wert zum ersten Mal hinzugefügt wird, eine leere Liste erstellen.HashMap<String, List<Integer>>
Eine weitere gute Wahl ist die Verwendung von MultiValuedMap von Apache Commons. In den All Known Implementing Classes oben auf der Seite finden Sie spezielle Implementierungen.
Beispiel:
könnte durch ersetzt werden
So,
würde zu einer Sammlung führen,
coll
die "A", "B" und "C" enthält.quelle
Schauen Sie sich
Multimap
die Guavenbibliotheken und ihre Implementierung an -HashMultimap
quelle
Ich verwende
Map<KeyType, Object[]>
zum Verknüpfen mehrerer Werte mit einem Schlüssel in einer Karte. Auf diese Weise kann ich mehrere Werte verschiedener Typen speichern, die einem Schlüssel zugeordnet sind. Sie müssen darauf achten, dass die Reihenfolge beim Einfügen und Abrufen von Object [] korrekt ist.Beispiel: Bedenken Sie, wir möchten Schülerinformationen speichern. Der Schlüssel ist die ID, während wir den Namen, die Adresse und die E-Mail-Adresse des Schülers speichern möchten.
quelle
quelle
Nur zur Veranschaulichung
Map::compute
: Die reine JDK8-Lösung wäre die Verwendung der folgenden Methode:Sowie
mit Ausgabe:
Beachten Sie, dass zur Gewährleistung der Konsistenz für den Fall, dass mehrere Threads auf diese Datenstruktur zugreifen
ConcurrentHashMap
undCopyOnWriteArrayList
beispielsweise verwendet werden müssen.quelle
computeIfAbsent
.map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
Wenn Sie Spring Framework verwenden . Es gibt :
org.springframework.util.MultiValueMap
.So erstellen Sie eine nicht modifizierbare Mehrwertkarte:
Oder verwenden
org.springframework.util.LinkedMultiValueMap
quelle
Ja und nein. Die Lösung besteht darin, eine Wrapper-Klasse für Ihre Werte zu erstellen, die die 2 (3 oder mehr) Werte enthält, die Ihrem Schlüssel entsprechen.
quelle
Ja, dies wird häufig als a bezeichnet
multimap
.Siehe: http://google-collections.googlecode.com/svn/trunk/javadoc/index.html?com/google/common/collect/Multimap.html
quelle
Am einfachsten wäre es, eine Google-Sammlungsbibliothek zu verwenden:
Maven-Link: https://mvnrepository.com/artifact/com.google.collections/google-collections/1.0-rc2
mehr dazu: http://tomjefferys.blogspot.be/2011/09/multimaps-google-guava.html
quelle
Ich habe die besten Ergebnisse erzielt.
Sie müssen nur neue
HashMap
wie erstellenin deiner
for
Schleife. Es hat den gleichen Effekt wie der gleiche Schlüssel und mehrere Werte.quelle
Ausgabe:
Dies ist die Google-Guava-Bibliothek für Dienstprogrammfunktionen. Dies ist die erforderliche Lösung.
quelle
Ich konnte keine Antwort auf Pauls Kommentar posten, daher erstelle ich hier einen neuen Kommentar für Vidhya:
Wrapper ist ein
SuperClass
für die beiden Klassen, die wir als Wert speichern möchten.In der Wrapper-Klasse können wir die Zuordnungen als Instanzvariablenobjekte für die beiden Klassenobjekte festlegen.
z.B
und in HashMap können wir auf diese Weise setzen,
WrapperObj hat Klassenvariablen:
class1Obj, class2Obj
quelle
Sie können es implizit tun.
Dies ist sehr einfach und effektiv. Wenn Sie stattdessen Werte verschiedener Klassen möchten, können Sie Folgendes tun:
quelle
Kann mit einer identityHashMap durchgeführt werden, unter der Bedingung, dass der Schlüsselvergleich vom Operator == und nicht von equals () durchgeführt wird.
quelle
Ich bevorzuge Folgendes, um eine beliebige Anzahl von Variablen zu speichern, ohne eine separate Klasse erstellen zu müssen.
quelle
Ich bin es gewohnt, dies nur mit einem Datenwörterbuch in Ziel C zu tun. Es war schwieriger, ein ähnliches Ergebnis in Java für Android zu erzielen. Am Ende habe ich eine benutzerdefinierte Klasse erstellt und dann nur eine Hashmap meiner benutzerdefinierten Klasse erstellt.
quelle
Wir können eine Klasse mit mehreren Schlüsseln oder Werten erstellen und das Objekt dieser Klasse kann als Parameter in der Karte verwendet werden. Sie können auf https://stackoverflow.com/a/44181931/8065321 verweisen
quelle
Verwenden von Java Collectors
wo Abteilung ist Ihr Schlüssel
quelle
Versuchen Sie LinkedHashMap , Beispiel:
Ausgabe:
quelle
linked
wird nicht mehr in der Karte vorhanden sein, da Sie sie durch ersetzt habenhash
.