Multiset 是 guava 包下一种新的集合,可以方便的统计集合中重复元素出现的次数。
Multiset 有以下实现类:
- HashMultiset::元素存放于 HashMap
- LinkedHashMap:即元素的排列顺序由第一次放入的顺序决定
- TreeMultiset:元素被排序存放于TreeMap
- EnumMultiset::元素必须是 enum 类型
- ImmutableMultiset: 不可修改的 Mutiset
下面谈谈 HashMultiset 常用的使用方法:
场景:统计一份名单中每个名字出现的次数。
在以前我们可能会使用 HashMap 来处理:
List<String> nameList = Arrays.asList("张三", "李四", "王五", "乔二娃", "张三", "李四", "Tom");
Map<String, Integer> nameCountMap = new HashMap<>();
for (String name : nameList) {
Integer count = nameCountMap.get(name);
nameCountMap.put(name, count != null ? ++count : 1);
}
System.out.println(nameCountMap.get("张三"));//2
使用 Multiset :
List<String> nameList = Arrays.asList("张三", "李四", "王五", "乔二娃", "张三", "李四", "Tom");
//创建一个 Multiset
Multiset<String> nameMultiset = HashMultiset.create();
nameMultiset.addAll(nameList);
Integer count = nameMultiset.count("张三");//2
Multiset 接口中定义的方法主要有:
- add(E element) :向其中添加单个元素
- add(E element,int occurrences) : 向其中添加指定个数的元素
- count(Object element) : 返回给定参数元素的个数
- remove(E element) : 移除一个元素,其count值 会响应减少
- remove(E element,int occurrences): 移除相应个数的元素
- elementSet() : 将不同的元素放入一个Set中
- entrySet(): 类似与Map.entrySet 返回Set<Multiset.Entry>。包含的Entry支持使用getElement()和getCount()
- setCount(E element ,int count): 设定某一个元素的重复次数
- setCount(E element,int oldCount,int newCount): 将符合原有重复个数的元素修改为新的重复次数
- retainAll(Collection c) : 保留出现在给定集合参数的所有的元素
- removeAll(Collectionc) : 去除出现给给定集合参数的所有的元素