HashMap: Ein Schlüssel, mehrere Werte

Wie kann ich den dritten Wert für den ersten Schlüssel in dieser Karte erhalten? Ist das möglich?

Zu diesem Zweck gibt es Bibliotheken, aber die einfachste Java-Methode besteht darin, eine Map of List wie folgt zu erstellen:

 Map> multiMap = new HashMap<>(); 

Es klingt, als ob du nach einer Multimap suchen würdest . Guava verfügt über verschiedene Multimap Implementierungen, die normalerweise über die Multimaps class erstellt werden.

Ich würde vorschlagen, dass die Verwendung dieser Implementierung ist einfacher als das Rollen Ihrer eigenen, erarbeiten, wie die API aussehen sollte, sorgfältig nach einer vorhandenen Liste suchen, wenn ein Wert hinzufügen usw. Wenn Ihre Situation eine besondere Abneigung gegen Bibliotheken von Drittanbietern hat Vielleicht ist es das wert, aber ansonsten ist Guava eine fabelhafte Bibliothek, die dir wahrscheinlich auch mit anderem Code helfen wird 🙂

Hast du so etwas?

 HashMap> 

Wenn dies der Fall ist, können Sie Ihre ArrayList durchlaufen und das gewünschte Element mit arrayList.get (i) abrufen.

Eine standardmäßige Java HashMap kann nicht mehrere Werte pro Schlüssel speichern. Jeder neue Eintrag, den Sie hinzufügen, überschreibt den vorherigen.

Das habe ich in einer ähnlichen Frage gefunden

 Map> hm = new HashMap>(); List values = new ArrayList(); values.add("Value 1"); values.add("Value 2"); hm.put("Key1", values); // to get the arraylist System.out.println(hm.get("key1")); 

ERGEBNIS: [Wert 1, Wert 2]

Verwenden Sie Sammlungen, um die Werte eines Schlüssels zu speichern:

 Map> 

Sie müssen die Werteliste selbst pflegen

Ich fand den Blog auf zufällige Suche, ich denke, das wird dazu beitragen, dies zu tun: http://tomjefferys.blogspot.com.tr/2011/09/multimaps-google-guava.html

 public class MutliMapTest { public static void main(String... args) { Multimap myMultimap = ArrayListMultimap.create(); // Adding some key/value myMultimap.put("Fruits", "Bannana"); myMultimap.put("Fruits", "Apple"); myMultimap.put("Fruits", "Pear"); myMultimap.put("Vegetables", "Carrot"); // Getting the size int size = myMultimap.size(); System.out.println(size); // 4 // Getting values Collection fruits = myMultimap.get("Fruits"); System.out.println(fruits); // [Bannana, Apple, Pear] Collection vegetables = myMultimap.get("Vegetables"); System.out.println(vegetables); // [Carrot] // Iterating over entire Mutlimap for(String value : myMultimap.values()) { System.out.println(value); } // Removing a single value myMultimap.remove("Fruits","Pear"); System.out.println(myMultimap.get("Fruits")); // [Bannana, Pear] // Remove all values for a key myMultimap.removeAll("Fruits"); System.out.println(myMultimap.get("Fruits")); // [] (Empty Collection!) } } 

Das Nachdenken über eine Karte mit 2 Schlüsseln zwang mich sofort, einen benutzerdefinierten Schlüssel zu verwenden, und das wäre wahrscheinlich eine class. Folgendes ist die Schlüsselklasse:

 public class MapKey { private Object key1; private Object key2; public Object getKey1() { return key1; } public void setKey1(Object key1) { this.key1 = key1; } public Object getKey2() { return key2; } public void setKey2(Object key2) { this.key2 = key2; } } // Create first map entry with key . MapKey mapKey1 = new MapKey(); mapKey1.setKey1("A"); mapKey1.setKey2("B"); 

HashMap – Einzelner Schlüssel und mehrere Werte unter Verwendung der Liste

 Map> map = new HashMap>(); // create list one and store values List One = new ArrayList(); One.add("Apple"); One.add("Aeroplane"); // create list two and store values List Two = new ArrayList(); Two.add("Bat"); Two.add("Banana"); // put values into map map.put("A", One); map.put("B", Two); map.put("C", Three); 

Sie können so etwas tun (fügen Sie nach Bedarf Zugriffsmodifizierer hinzu):

 Map> complexMap=new HashMap>(); 

Sie können Daten wie folgt einfügen:

  Map componentMap = new HashMap(); componentMap.put("foo","bar"); componentMap.put("secondFoo","secondBar"); complexMap.put("superFoo",componentMap); 

Die generierte Datenstruktur wäre:

 {superFoo={secondFoo=secondBar, foo=bar}} 

Auf diese Weise sollte jeder Wert für den Schlüssel eine eindeutige Kennung haben . Gibt auch O (1) für Abrufe, wenn Schlüssel bekannt sind.

Schreiben Sie eine neue class, die alle benötigten Werte enthält, und verwenden Sie das Objekt der neuen class als Wert in Ihrer HashMap

 HashMap class MyObject { public String value1; public int value2; public List value3; }