HashMap: Ein Schlüssel, mehrere Werte

72

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

Sonnenschutz
quelle
Ich kann den ersten Wert für einen Schlüssel mit der Member-Funktion von HashMap :: get durch den dritten erhalten? Ich kann leider keinen Code finden.
Sonnenschutz
2
Sie können Ihren eigenen Code nicht finden? Davon spricht er.
Bhesh Gurung
1
Klingt so, als wären Sie etwas verwirrt über den Unterschied zwischen Schlüsseln und Hash-Schlüsseln. Hoffentlich werden Sie dies
klarstellen
4
Eine Karte kann nicht mehrere Werte für einen Schlüssel haben, aber Sie können stattdessen eine Sammlung als Wert haben
Nathan Q

Antworten:

92

Es gibt Bibliotheken, um dies zu tun, aber der einfachste einfache Java-Weg besteht darin, eine Mapder folgenden zu erstellen List:

Map<Object,ArrayList<Object>> multiMap = new HashMap<>();
Solendil
quelle
9
5 Sekunden von der Tastatur gedreht und boom ... die gleiche Antwort von jemand anderem. +1
Newtopian
4
Es kann jedoch durchaus einfacher sein, eine Bibliothek zu verwenden, als eine eigene zu rollen, sie zu testen usw.
Jon Skeet
Diese Lösung würde nur funktionieren, wenn die Objekte in der ArrayList vom gleichen Typ sind. S, zB ist es nicht möglich, einen Schlüssel mit einem int und einem doppelten Wert zu haben ..
lydiaP
@ JonSkeet Welche Bibliothek wird für diesen Anwendungsfall empfohlen?
Gaurav
1
@gaurav: Es ist so lange her, dass ich in der Java-Welt war, dass ich nicht sagen möchte. Ich würde mir aber Guave ansehen.
Jon Skeet
31

Es hört sich so an, als ob Sie nach einer Multimap suchen . Guava hat verschiedene MultimapImplementierungen, die normalerweise über die MultimapsKlasse erstellt werden.

Ich würde vorschlagen, dass die Verwendung dieser Implementierung wahrscheinlich einfacher ist, als Ihre eigene zu rollen, herauszufinden, wie die API aussehen sollte, sorgfältig nach einer vorhandenen Liste zu suchen, wenn Sie einen Wert hinzufügen usw. Wenn Ihre Situation eine besondere Abneigung gegen Bibliotheken von Drittanbietern aufweist Vielleicht lohnt es sich, das zu tun, aber ansonsten ist Guava eine fabelhafte Bibliothek, die Ihnen wahrscheinlich auch mit anderem Code helfen wird :)

Jon Skeet
quelle
Apache Commons Collections verfügt auch über eine Multimap- Implementierung.
Robert
Aktualisierter Link für die Apache Commons MultiMap
Joarder Kamal
Lol zwei schlechte Links.
GC_
@GC_: Nun ja, die Post ist fast 9 Jahre alt. Das passiert. Leicht zu reparieren, keine Notwendigkeit "lol". (Oder meinten Sie die Apache Commons? In diesem Fall, anstatt zu lachen, denke ich immer noch, dass die konstruktivere Antwort darin besteht, den neuen Link zu posten : MultiMap )
Jon Skeet
23

Zum Beispiel:

Map<Object,Pair<Integer,String>> multiMap = new HashMap<Object,Pair<Integer,String>>();

wobei das Paireine parametrische Klasse ist

public class Pair<A, B> {
    A first = null;
    B second = null;

    Pair(A first, B second) {
        this.first = first;
        this.second = second;
    }

    public A getFirst() {
        return first;
    }

    public void setFirst(A first) {
        this.first = first;
    }

    public B getSecond() {
        return second;
    }

    public void setSecond(B second) {
        this.second = second;
    }

}
jfabrizio
quelle
12

Dies ist, was ich in der Antwort einer ähnlichen Frage gefunden habe

Map<String, List<String>> hm = new HashMap<String, List<String>>();
List<String> values = new ArrayList<String>();
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]

Neo
quelle
System.out.println (hm.get ("Key1"));
Schneebasen
10

Hast du so etwas?

HashMap<String, ArrayList<String>>

In diesem Fall können Sie Ihre ArrayList durchlaufen und mit arrayList.get (i) das gewünschte Element abrufen.

oopbase
quelle
3
wie man Elemente zur Arrayliste hinzufügt und iteriert
user3504024
9

Eine Standard-Java-HashMap kann nicht mehrere Werte pro Schlüssel speichern. Jeder neue Eintrag, den Sie hinzufügen, überschreibt den vorherigen.

Andrew Stubbs
quelle
7

Ich habe den Blog bei einer zufälligen Suche gefunden. Ich denke, dies wird dabei helfen: http://tomjefferys.blogspot.com.tr/2011/09/multimaps-google-guava.html

public class MutliMapTest {
public static void main(String... args) {
   Multimap<String, String> 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<String> fruits = myMultimap.get("Fruits");
   System.out.println(fruits); // [Bannana, Apple, Pear]

   Collection<string> 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!)
}
}
ozan.yarci
quelle
Das Beste und Einfachste von allen, danke Ozan. Danke Guave.
Abdullah
5

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

Map<Key, Collection<Value>>

Sie müssen die Werteliste selbst pflegen

zhuwenger
quelle
1

Apache Commons-Sammlungsklassen sind die Lösung.

    MultiMap multiMapDemo = new MultiValueMap();

    multiMapDemo .put("fruit", "Mango");
    multiMapDemo .put("fruit", "Orange");
    multiMapDemo.put("fruit", "Blueberry");

    System.out.println(multiMap.get("fruit"));
   // Mango Orange Blueberry

Maven-Abhängigkeit

    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -- 
     >
     <dependency>
         <groupId>org.apache.commons</groupId>
         <artifactId>commons-collections4</artifactId>
         <version>4.4</version>
    </dependency>
Vikas Piprade
quelle
0

Wenn ich an eine Karte mit zwei Schlüsseln dachte, musste ich sofort einen benutzerdefinierten Schlüssel verwenden, und das wäre wahrscheinlich eine Klasse. Es folgt 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 <A,B>.
        MapKey mapKey1 = new MapKey();
        mapKey1.setKey1("A");
        mapKey1.setKey2("B");
JR
quelle
0

HashMap - Einzelschlüssel und mehrere Werte mit Liste

Map<String, List<String>> map = new HashMap<String, List<String>>();

  // create list one and store values

    List<String> One = new ArrayList<String>();
    One.add("Apple");
    One.add("Aeroplane");

    // create list two and store values
    List<String> Two = new ArrayList<String>();
    Two.add("Bat");
    Two.add("Banana");

    // put values into map
    map.put("A", One);
    map.put("B", Two);
    map.put("C", Three);
Immer Bijoy
quelle
0

Sie können Folgendes tun (nach Bedarf Zugriffsmodifikatoren hinzufügen):

Map<String,Map<String,String>> complexMap=new HashMap<String,Map<String,String>>();

Sie können Daten wie folgt einfügen:

    Map<String,String> componentMap = new HashMap<String,String>();
    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 an, wenn Schlüssel bekannt sind.

thedeadalive
quelle
Wie kann man dann Daten dafür einstellen?
Saikat
@ SaikatBarua Entschuldigung für die verspätete Antwort. Bitte überprüfen Sie die aktualisierte Antwort.
theeadalive
0

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

HashMap<String, MyObject>

class MyObject {
public String value1;
public int value2;
public List<String> value3;
}
George Arokiam
quelle
0

Hier ist der Code, wie man die Hashmap in Arrays extrahiert, eine Hashmap, die eine Arrayliste enthält

Map<String, List<String>> country_hashmap = new HashMap<String, List<String>>();
List<String> my = new ArrayList<String>();
arraylist.add("16873538.webp");
arraylist.add("16873539.webp");
country_hashmap.put("Malaysia", my);

// make another one
List<String> jpn = new ArrayList<String>();
soraru.add("16873540.webp");
soraru.add("16873541.webp");
country_hashmap.put("Japanese", jpn);

for(Map.Entry<String, List<String>> hashmap_data : country_hashmap.entrySet()){
      String key = hashmap_data.getKey(); // contains the keys
      List<String> val = hashmap_data.getValue(); // contains arraylists
      // print all the key and values in the hashmap
      System.out.println(key + ": " +val);

      // using interator to get the specific values arraylists
      Iterator<String> itr = val.iterator();
      int i = 0;
      String[] data = new String[val.size()];
        while (itr.hasNext()){
            String array = itr.next();
            data[i] = array;
            System.out.println(data[i]); // GET THE VALUE
            i++;
        }
  }
Schneebasen
quelle