如何在Map<中自动填充值字符串,集合>一经请求

时间:2012-04-15 02:51:53

标签: java collections

我发现自己经常写这样的代码:

Map < String, Set < String > > map = new TreeMap < String, Set < String > >();
String key;
String element;
/* ... */
Set < String > value = map.get(key);
if (value == null) {
  value = new TreeSet < String >();
  map.put(key, value);
}
value.add(element);

我讨厌上面的if声明 - 如何在标准Java中摆脱它?如果您可以确认没有标准的Java解决方案,那么如果您可以建议一个满足此需求的非标准库,那就太好了。

2 个答案:

答案 0 :(得分:2)

Apache Commons Collections有MultiMap

MultiMap mhm = new MultiHashMap();
mhm.put(key, "A");
mhm.put(key, "B");
mhm.put(key, "C");
Collection coll = (Collection) mhm.get(key);

Guava(曾经是Google Collections)has one too,支持泛型,并且有treehash版本:

Multimap<String,String> mhm = new TreeMultimap<String,String>();
// etc.

为了澄清,Multimap<T, S>Map<T, Collection<S>>基本相同,put会在需要时自动创建该集合。

编辑:已更新以链接到Guava,因为显然谷歌馆藏已被弃用。

答案 1 :(得分:1)

嗯......我喜欢Brendan的multimap答案,但您也可以使用静态实用程序方法并保持标准的java.util类/接口:

public static <K,V> Set<V> getTreeSet(Map<K,Set<V>> map, K key) {
    Set<V> set = map.get(key);
    if (set == null) {
        set = new TreeSet<V>();
        map.put(key, set);
    }
    return set;
}

然后可以编写带有空检查的代码:

Map < String, Set < String > > map = new TreeMap < String, Set < String > >();
String key;
String element;
/* ... */
MapUtils.getTreeSet(map, key).add(element);

每个集合类型都需要静态方法,但这似乎比一遍又一遍地编写相同的代码要好。