2016-08-17 2 views
0

an verschiedenen Projekten arbeitete ich an, fand ich ein Muster wieKomfortklasse für Karte Handhabung <K, List<V>>

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

public void addValue(Integer key, String value) { 
    if (!listMap.containsKey(key)) { 
     listMap.put(key, new ArrayList<String>()); 
    } 
    listMap.get(key).add(value); 
} 

Karten aufzufüllen, die Lists als Werte haben.

Da dies ein so häufiges Muster ist, habe ich mich gefragt, ob es nicht irgendeine Convenience-Klasse in den Standardbibliotheken oder etwas wie Guave gibt, das das Hinzufügen und Entfernen von Werten zu dieser Struktur verwaltet.

+0

Spring hat 'MultiValueMap', aber dafür gibt es keinen Standard. –

+1

Haben Sie sich die Guava-Dokumentation angesehen? ['interface Multimap'] (http://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/Multimap.html) – Jesper

+0

Es gibt auch Apache Commons Collections - [' interface MultiMap '] (https://commons.apache.org/proper/commons-collections/javadocs/api-release/org/apache/commons/collections4/MultiMap.html) – Jesper

Antwort

4

Guava bietet Multimap, die für Ihren Zweck sehr geeignet ist:

ListMultimap<Integer, String> listMap = ArrayListMultimap.create(); 

public void addValue(Integer key, String value) { 
    listMap.put(key, value); 
} 

public List<String> getValues(Integer key) { 
    return listMap.get(key); 
} 

public Map<Integer, List<String>> asMap() { 
    // See documentation for details 
    return Multimaps.asMap(listMap); 
} 

Java 8 bietet auch einen bequemeren Weg, um und einen Wert in einer einzigen Anweisung initialisiert:

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

public void addValue(Integer key, String value) { 
    listMap.computeIfAbsent(key, k -> new ArrayList<>()).add(value); 
} 

On eine Randnotiz, würde ich Ihr ursprüngliches Beispiel ein bisschen zu vermeiden, eine zusätzliche Lookup ändern, wenn ein passender Schlüssel gefunden wird:

public void addValue(Integer key, String value) { 
    List<String> values = listMap.get(key); 
    if (values == null) { 
     listMap.put(key, values = new ArrayList<>()); 
    } 
    values.add(value); 
} 
+1

Es ist vielleicht wert darauf hinzuweisen, dass 'Map >' in der Lage ist, Werte zu speichern, die 'ListMultimap ' nicht kann: Ersterer kann eine leere Liste mit einem Schlüssel haben, während er dies meldet Geben Sie den 'keySet()' ein; Letzteres kann nicht. Es scheint nicht so, als würde es den Anwendungsfall von OP beeinflussen, aber es ist gelegentlich ein wichtiger Unterschied. –

Verwandte Themen