google-collections探訪(2) -Multiset,Multimap-

前回:google-collections探訪(1) -map,filter- - souta-bot log
お次は新しく追加されたコレクションクラスを見てみる。

Multiset

重複を許すSet。またの名をBag。

HashMultiset
Multiset<String> histogram = HashMultiset.create();
histogram.add("foo");
histogram.add("bar");
histogram.add("baz", 3);
histogram.add("foo");

System.out.println(histogram.entrySet());   // [baz x 3, foo x 2, bar]
System.out.println(histogram.elementSet()); // [baz, foo, bar]
System.out.println(histogram.count("foo")); // 2
System.out.println(histogram.size());       // 6
histogram.remove("foo");
System.out.println(histogram);              // [baz x 3, foo, bar]

Multimap

キー1つに対し複数の値を持てるMap。Map>の代替。
値に重複する値を許可するのと、しないのあり。

ArrayListMultinap
Multimap<Integer, String> map = ArrayListMultimap.create();
map.put(1, "hoge");
map.put(1, "huga");
map.put(1, "hugo");
map.putAll(2, Arrays.asList("foo","bar","baz"));
// 値に重複おk
map.putAll(3, Arrays.asList("spam","spam","egg"));
System.out.println(map);           // {1=[hoge, huga, hugo], 2=[foo, bar, baz], 3=[spam, spam, egg]}
System.out.println(map.get(2));    // [foo, bar, baz]
System.out.println(map.keySet());  // [1, 2, 3]
// キーをMultisetで取得
System.out.println(map.keys());    // [1 x 3, 2 x 3, 3 x 3]
System.out.println(map.values());  // [hoge, huga, hugo, foo, bar, baz, spam, spam, egg]
System.out.println(map.entries()); // [1=hoge, 1=huga, 1=hugo, 2=foo, 2=bar, 2=baz, 3=spam, 3=spam, 3=egg]
// Map<K,Collection<V>>へ変換
System.out.println(map.asMap());   // {1=[hoge, huga, hugo], 2=[foo, bar, baz], 3=[spam, spam, egg]}

map.remove(2, "bar");
System.out.println(map);           // {1=[hoge, huga, hugo], 2=[foo, baz], 3=[spam, spam, egg]}
map.removeAll(2);
System.out.println(map);           // {1=[hoge, huga, hugo], 3=[spam, spam, egg]}
map.replaceValues(1, Arrays.asList("ほげ","ふが"));
System.out.println(map);           // {1=[ほげ, ふが], 3=[spam, spam, egg]}

System.out.println(map.containsEntry(3, "spam")); // true
System.out.println(map.containsKey(1));           // true
System.out.println(map.containsValue("spam"));    // true
HashMultimap
Multimap<Integer, String> map2 = HashMultimap.create();
map2.put(1, "hoge");
// 重複不許可(例外は発生しない)
map2.put(1, "hoge");
map2.put(1, "huga");
map2.put(2, "foo");
System.out.println(map2);                    // {1=[hoge, huga], 2=[foo]}
map2.putAll(2, Arrays.asList("bar", "baz"));
System.out.println(map2);                    // {1=[hoge, huga], 2=[baz, foo, bar]}