guava之Multiset


 一、概述

  Guava提供了一个新集合类型Multiset,它可以多次添加相等的元素,且和元素顺序无关,Multiset继承于JDK的Collection接口,而不是Set接口,它和set最大的区别就是

它可以对相同元素做一个计数的功能,普通的Set就像:[car,ship,bike],而Multiset会是这样:[car x 2,ship x 6,bike x 3]有这样有用的功能

就是跟踪每种对象的数量,所以你可以用来进行数字统计,每存放一个元素,那么该元素的count就加1

譬如一个List里面有各种字符串,然后你要统计每个字符串List里面出现的次数,这个用Multiset就可以快速实现

1、举例说明

public class MultisetTest {
public static void main(String[] args) { String str = "张三 李四 李四 王五 王五 王五";
String[] strArr = str.split(" ");
List<String> words = Arrays.asList(strArr);
//创建一个HashMultiset集合,并将words集合数据放入
Multiset<String> wordMultiset = HashMultiset.create();
wordMultiset.addAll(words); //将不同的元素放在一个集合set中
for (String key : wordMultiset.elementSet()) {
//查看指定元素的个数
System.out.println(key + "-->" + wordMultiset.count(key));
} System.out.println("---------向集合中添加元素----------");
//向集合中添加元素
wordMultiset.add("李四");
for (String key : wordMultiset.elementSet()) {
System.out.println(key + "-->" + wordMultiset.count(key));
} System.out.println("-------向集合中添加若干个元素------");
//向集合中添加若干个元素
wordMultiset.add("赵六", 10);
for (String key : wordMultiset.elementSet()) {
System.out.println(key + "-->" + wordMultiset.count(key));
}
System.out.println("--------向集合中移出一个元素------");
//向集合中移出一个元素
wordMultiset.remove("张三");
for (String key : wordMultiset.elementSet()) {
System.out.println(key + "-->" + wordMultiset.count(key));
} System.out.println("------向集合中移出若干个元素------");
//向集合中移出若干个元素,如果元素的个数小于要移除的个数,则会把该元素移除光
wordMultiset.remove("赵六",5);
for (String key : wordMultiset.elementSet()) {
System.out.println(key + "-->" + wordMultiset.count(key));
} System.out.println("-----设定某一个元素的重复次数-----");
//设定某一个元素的重复次数
wordMultiset.setCount("张三", 10);
for (String key : wordMultiset.elementSet()) {
System.out.println(key + "-->" + wordMultiset.count(key));
} System.out.println("-----设置复合元素的个数设为新的重复次数-----");
//设置复合元素的个数设为新的重复次数(条件是第二个参数的数量要是实际数量一致,否则无效)
wordMultiset.setCount("张三", 10,1);
for (String key : wordMultiset.elementSet()) {
System.out.println(key + "-->" + wordMultiset.count(key));
} System.out.println("-------删除给定集合中的元素------");
//删除给定集合中的元素
wordMultiset.removeAll(words);
for (String key : wordMultiset.elementSet()) {
System.out.println(key + "-->" + wordMultiset.count(key));
} }
}

看运行结果:

 

根据运行结果我们得到:

  (1)它把list放入HashMultiset中,就成了key还是list的属性,value就是重复数的一个计数

  (2)每添加一个相同元素,计数+1

  (3)可以添加和移除计数的值

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) : 去除出现给给定集合参数的所有的元素

 3、常用的实现了Multiset接口的类

  1、HashMultiset:元素存放于HashMap

  2、LinkedHashMultiset:元素存放于LinkedHashMap,即元素的排列顺序由第一次放入的顺序决定

  3、TreeMultiset:元素被排序存放于TreeMap

  4、EnumMultiset:元素必须是enum类型

  5、ImmutableMultiset:不可修改的Multiset

4、Multiset与Map<E,Integer>区别

  实际开发中我们也可以利用Map<E,Integer>来实现计数功能,但它和Multiset还是有很大的区别,首先Multiset是单列集合,Map<E,Integer>是双列集合,类型结构不一样

区别:

  1、Multiset中的元素出现的次数只能为正数,如果E的出现次数为0,那么E将不出现在multiset中,是不能再elementSet()和entrySet()的视图中;

  2、multiset.size()返回这个集合的大小,相当于multiset中元素的出现的总数,如果想得到multiset中不同元素出现的总数,可以利用elementSet().size()来实现;

  3、multiset.iterator()可以遍历multiset中的所有元素,所以iterator遍历的次数就相当于multiset.size();

  4、Multiset支持添加,删除元素,设置元素出现的次数,setCount(elem,0)相当于移除elem的所有元素;

  5、multiset.count(elem)方法中的elem如果没有出现在Multiset中,那么它的返回值永远是0

最新文章

  1. BaseDao代码,用于连接数据库实行增删改查等操作
  2. Hibernate中saveOrUpdate()和merge()的区别
  3. VS用法总结
  4. hdu 4712 Hamming Distance(随机数法)
  5. 用Java Servlets代替CGI
  6. Javacript 客户端保存数据[ locaStorage ]
  7. HTTP 错误 500.21 - Internal Server Error的解决方案
  8. Mozilla对HTML5规范支持列表
  9. Python处理json字符串转化为字典
  10. Android更新主线程UI的两种方式handler与runOnUiThread()
  11. SQL优化 MySQL版 - 避免索引失效原则(二)
  12. 初识服务发现及Consul框架的简单使用
  13. grid和flex区别
  14. Pinterest凭什么拥有那么多用户:机器学习是答案
  15. Redis常用命令与高级应用
  16. tp5 Excel导入
  17. &lt;spark&gt; hadoop/spark 集群搭建
  18. NHibernate 有好几种数据库查询方式
  19. 并发编程之 CountDown 源码分析
  20. sass和scss相关知识

热门文章

  1. PHP对象基础
  2. zsy后台管理系统-架构设计
  3. Java开发架构篇:DDD模型领域层决策规则树服务设计
  4. ArrayList详解-源码分析
  5. jsp获取当前日期
  6. HTML使用正则验证
  7. 苏浪浪 201771010120 第三周 Java基本程序设计总结
  8. python-基站位置查询
  9. python字典详细介绍
  10. Asp.net MVC Razor视图模版动态渲染PDF,Razor模版生成静态Html