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<>();
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 :)
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
publicclassPair<A, B> {
A first = null;
B second = null;
Pair(A first, B second) {
this.first = first;
this.second = second;
}
public A getFirst(){
return first;
}
publicvoidsetFirst(A first){
this.first = first;
}
public B getSecond(){
return second;
}
publicvoidsetSecond(B second){
this.second = second;
}
}
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"));
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:
publicclassMapKey{
private Object key1;
private Object key2;
public Object getKey1(){
return key1;
}
publicvoidsetKey1(Object key1){
this.key1 = key1;
}
public Object getKey2(){
return key2;
}
publicvoidsetKey2(Object key2){
this.key2 = key2;
}
}
// Create first map entry with key <A,B>.
MapKey mapKey1 = new MapKey();
mapKey1.setKey1("A");
mapKey1.setKey2("B");
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);
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++;
}
}
Antworten:
Es gibt Bibliotheken, um dies zu tun, aber der einfachste einfache Java-Weg besteht darin, eine
Map
der folgenden zu erstellenList
:Map<Object,ArrayList<Object>> multiMap = new HashMap<>();
quelle
Es hört sich so an, als ob Sie nach einer Multimap suchen . Guava hat verschiedene
Multimap
Implementierungen, die normalerweise über dieMultimaps
Klasse 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 :)
quelle
Zum Beispiel:
Map<Object,Pair<Integer,String>> multiMap = new HashMap<Object,Pair<Integer,String>>();
wobei das
Pair
eine parametrische Klasse istpublic 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; } }
quelle
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]
quelle
Hast du so etwas?
In diesem Fall können Sie Ihre ArrayList durchlaufen und mit arrayList.get (i) das gewünschte Element abrufen.
quelle
Eine Standard-Java-HashMap kann nicht mehrere Werte pro Schlüssel speichern. Jeder neue Eintrag, den Sie hinzufügen, überschreibt den vorherigen.
quelle
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!) } }
quelle
Verwenden Sie Sammlungen, um die Werte eines Schlüssels zu speichern:
Sie müssen die Werteliste selbst pflegen
quelle
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>
quelle
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");
quelle
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);
quelle
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:
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.
quelle
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; }
quelle
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++; } }
quelle