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]}