一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情。
3、新集合类型接口
3.1、Multiset
3.1.1、本质
本质上是Map<E, Integer>结构,key为元素,value为计数。
3.1.2、常用实现
Multiset是 Map<E, Integer>结构 ,提供了多种实现,都是基于XXXMultiset的实现
- HashMultiset
- LinkedHashMultiset
- TreeMultiset
- ConcurrentHashMultiset
- ImmutableMultiset
3.1.3、常见方法
3.1.4、代码示例
/**
* 1、统计字符串出现的次数
*
* 常规情况下可能要这样编写
* Map<String, Integer> counts = new HashMap<String, Integer>();
* for (String word : words) {
* Integer count = counts.get(word);
* if (count == null) {
* counts.put(word, 1);
* } else {
* counts.put(word, count + 1);
* }
*
*
* Multiset就简单太多了
*
*/
List<String> strings = Lists.newArrayList("hello","java","hello","guava");
Multiset<String> multiset = HashMultiset.create();
// 直接加入集合
multiset.addAll(strings);
// 单次统计
multiset.add("word");
//multiset.add("word1",0); -1
// 指定统计次数
multiset.add("word",2);
// [java, hello x 2, guava, word x 3]
System.out.println(multiset);
multiset.remove("word",1);
// 删除一个统计 [java, hello x 2, guava, word x 2]
System.out.println(multiset);
// 获取全部元素出现的次数 6
System.out.println("获取全部元素出现的次数="+multiset.size());
// 获取指定字符串的次数 2
System.out.println("获取指定字符串的次数="+multiset.count("word"));
// 返回元素的set集合 [java, hello, guava, word]
System.out.println("返回元素的set集合="+multiset.elementSet());
/**
* 2个Multiset直之间的各种运算
*/
Multiset<String> multiset1 = HashMultiset.create();
multiset1.add("a", 2);
multiset1.add("c", 2);
Multiset<String> multiset2 = HashMultiset.create();
multiset2.add("a", 2);
multiset2.add("ad", 1);
boolean flag = multiset1.containsAll(multiset2);
// 返true 因为包含了所有不重复元素,
System.out.println("是否包含全部元素="+flag);
// 保留出现在指定集合中的元素 之前 [a x 2, ad] 之后 [a x 2]
multiset2.retainAll(multiset1);
System.out.println("是否包含全部元素2="+multiset2);
// 删除出现只指定集合中的元素
multiset2.removeAll(multiset1);//multiset2移除所有"a",虽然multiset1只有2个"a"
System.out.println("删除出现只指定集合中的元素="+multiset2);
// 元素是否为空
flag = multiset2.isEmpty();
System.out.println("元素是否为空="+flag);
/**
* 其他实现
*/
Multiset<String> multisett = HashMultiset.create();
multisett.add("hello");
multisett.add("java");
LinkedHashMultiset hashMultiset = LinkedHashMultiset.create();
hashMultiset.add("hello");
hashMultiset.add("ajava");
System.out.println(multisett);
System.out.println(hashMultiset);