我发现自己经常写这样的代码:
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解决方案,那么如果您可以建议一个满足此需求的非标准库,那就太好了。
答案 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,支持泛型,并且有tree和hash版本:
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);
每个集合类型都需要静态方法,但这似乎比一遍又一遍地编写相同的代码要好。