3

私はよくそのようなコードを書いていることに気づきます:

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ソリューションがないことを確認できれば、このニーズに対応する非標準のライブラリを提案できれば便利です。

4

2 に答える 2

2

Apache CommonsCollectionsには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コレクションでした)にもジェネリックをサポートするものがあり、ツリーバージョンとハッシュバージョンの両方があります。

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

明確にするために、Multimap<T, S>は基本的にと同じであり、必要に応じてコレクションMap<T, Collection<S>>を自動的に作成します。put

編集:明らかにGoogleコレクションは非推奨になっているため、Guavaにリンクするように更新されました。

于 2012-04-15T02:58:05.497 に答える
1

うーん...私はブレンダンのマルチマップの答えが好きですが、静的ユーティリティメソッドを使用して標準の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;
}

次に、nullチェックを含むコードを記述できます。

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

コレクションの種類ごとに静的メソッドが必要ですが、同じコードを何度も書くよりも良いようです。

于 2012-04-15T04:02:26.223 に答える