Guava引进了JDK里没有的,但是非常有用的一些新的集合类型。所有这些新集合类型都能和JDK里的集合平滑集成。Guava集合非常精准地实现了JDK定义的接口。Guava中定义的新集合有:
  Multiset
  SortedMultiset
  Multimap
  ListMultimap
  SetMultimap
  BiMap
  ClassToInstanceMap
  Table

  Multiset集合

  Multiset是什么?顾名思义,Multiset和Set的区别就是可以保存多个相同的对象。在JDK中,List和Set有一个基本的区别,就是List可以包含多个相同对象,且是有顺序的,而Set不能有重复,且不保证顺序(有些实现有顺序,例如LinkedHashSet和SortedSet等)所以Multiset占据了List和Set之间的一个灰色地带:允许重复,但是不保证顺序。
  常见使用场景:Multiset有一个有用的功能,就是跟踪每种对象的数量,所以你可以用来进行数字统计。 常见的普通实现方式如下:

  1. @Test
  2. public void testWordCount(){
  3. String strWorld="wer|dffd|ddsa|dfd|dreg|de|dr|ce|ghrt|cf|gt|ser|tg|ghrt|cf|gt|" +
  4. "ser|tg|gt|kldf|dfg|vcd|fg|gt|ls|lser|dfr|wer|dffd|ddsa|dfd|dreg|de|dr|" +
  5. "ce|ghrt|cf|gt|ser|tg|gt|kldf|dfg|vcd|fg|gt|ls|lser|dfr";
  6. String[] words=strWorld.split("\\|");
  7. Map<String, Integer> countMap = new HashMap<String, Integer>();
  8. for (String word : words) {
  9. Integer count = countMap.get(word);
  10. if (count == null) {
  11. countMap.put(word, 1);
  12. }
  13. else {
  14. countMap.put(word, count + 1);
  15. }
  16. }
  17. System.out.println("countMap:");
  18. for(String key:countMap.keySet()){
  19. System.out.println(key+" count:"+countMap.get(key));
  20. }
  21. }

  上面的代码实现的功能非常简单,用于记录字符串在数组中出现的次数。这种场景在实际的开发过程还是容易经常出现的,如果使用实现Multiset接口的具体类就可以很容易实现以上的功能需求:

  1. public void testMultsetWordCount(){
  2. String strWorld="wer|dfd|dd|dfd|dda|de|dr";
  3. String[] words=strWorld.split("\\|");
  4. List<String> wordList=new ArrayList<String>();
  5. for (String word : words) {
  6. wordList.add(word);
  7. }
  8. Multiset<String> wordsMultiset = HashMultiset.create();
  9. wordsMultiset.addAll(wordList);

  10. for(String key:wordsMultiset.elementSet()){
  11. System.out.println(key+" count:"+wordsMultiset.count(key));
  12. }
  13. }

  Multiset主要方法

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

  常用方法实例:

  1. @Test
  2. public void testMultsetWordCount(){
  3. String strWorld="wer|dfd|dd|dfd|dda|de|dr";
  4. String[] words=strWorld.split("\\|");
  5. List<String> wordList=new ArrayList<String>();
  6. for (String word : words) {
  7. wordList.add(word);
  8. }
  9. Multiset<String> wordsMultiset = HashMultiset.create();
  10. wordsMultiset.addAll(wordList);
  11.  
  12. //System.out.println("wordsMultiset:"+wordsMultiset);
  13.  
  14. for(String key:wordsMultiset.elementSet()){
  15. System.out.println(key+" count:"+wordsMultiset.count(key));
  16. }
  17.  
  18. if(!wordsMultiset.contains("peida")){
  19. wordsMultiset.add("peida", 2);
  20. }
  21. System.out.println("============================================");
  22. for(String key:wordsMultiset.elementSet()){
  23. System.out.println(key+" count:"+wordsMultiset.count(key));
  24. }
  25.  
  26. if(wordsMultiset.contains("peida")){
  27. wordsMultiset.setCount("peida", 23);
  28. }
  29.  
  30. System.out.println("============================================");
  31. for(String key:wordsMultiset.elementSet()){
  32. System.out.println(key+" count:"+wordsMultiset.count(key));
  33. }
  34.  
  35. if(wordsMultiset.contains("peida")){
  36. wordsMultiset.setCount("peida", 23,45);
  37. }
  38.  
  39. System.out.println("============================================");
  40. for(String key:wordsMultiset.elementSet()){
  41. System.out.println(key+" count:"+wordsMultiset.count(key));
  42. }
  43.  
  44. if(wordsMultiset.contains("peida")){
  45. wordsMultiset.setCount("peida", 44,67);
  46. }
  47.  
  48. System.out.println("============================================");
  49. for(String key:wordsMultiset.elementSet()){
  50. System.out.println(key+" count:"+wordsMultiset.count(key));
  51. }
  52. }

  输出:

  1. de count1
  2. dda count1
  3. dd count1
  4. dfd count2
  5. wer count1
  6. dr count1
  7. ============================================
  8. de count1
  9. dda count1
  10. dd count1
  11. dfd count2
  12. peida count2
  13. wer count1
  14. dr count1
  15. ============================================
  16. de count1
  17. dda count1
  18. dd count1
  19. dfd count2
  20. peida count23
  21. wer count1
  22. dr count1
  23. ============================================
  24. de count1
  25. dda count1
  26. dd count1
  27. dfd count2
  28. peida count45
  29. wer count1
  30. dr count1
  31. ============================================
  32. de count1
  33. dda count1
  34. dd count1
  35. dfd count2
  36. peida count45
  37. wer count1
  38. dr count1

  说明:setCount(E element,int oldCount,int newCount): 方法,如果传入的oldCount和element的不一致的时候,是不能讲element的count设置成newCount的。需要注意。

  Multiset不是Map

  需要注意的是Multiset不是一个Map<E,Integer>,尽管Multiset提供一部分类似的功能实现。其它值得关注的差别有:
  Multiset中的元素的重复个数只会是正数,且最大不会超过Integer.MAX_VALUE。设定计数为0的元素将不会出现multiset中,也不会出现elementSet()和entrySet()的返回结果中。
  multiset.size() 方法返回的是所有的元素的总和,相当于是将所有重复的个数相加。如果需要知道每个元素的个数可以使用elementSet().size()得到.(因而调用add(E)方法会是multiset.size()增加1).
  multiset.iterator() 会循环迭代每一个出现的元素,迭代的次数与multiset.size()相同。 iterates over each occurrence of each element, so the length of the iteration is equal to multiset.size().
  Multiset 支持添加、移除多个元素以及重新设定元素的个数。执行setCount(element,0)相当于移除multiset中所有的相同元素。
  调用multiset.count(elem)方法时,如果该元素不在该集中,那么返回的结果只会是0。

  Multiset的实现 

  Guava提供了Multiset的多种实现,这些实现基本对应了JDK中Map的实现:
  Map                        Corresponding Multiset   Supports null elements
  HashMap                  HashMultiset                      Yes
  TreeMap                   TreeMultiset                       Yes (if the comparator does)
  LinkedHashMap         LinkedHashMultiset             Yes
  ConcurrentHashMap  ConcurrentHashMultiset       No
  ImmutableMap          ImmutableMultiset               No

Guava学习笔记:Guava新增集合类型-Multiset的更多相关文章

  1. Guava新增集合类型-Multiset

    Guava新增集合类型-Multiset Guava引进了JDK里没有的,但是非常有用的一些新的集合类型.所有这些新集合类型都能和JDK里的集合平滑集成.Guava集合非常精准地实现了JDK定义的接口 ...

  2. 004-guava 集合-新增集合类型-MultiSet, MultiMap, BiMap , Table, ClassToInstanceMap, RangeSe, RangeMap等

    一.概述 Guava引入了很多JDK没有的.但明显有用的新集合类型.这些新类型是为了和JDK集合框架共存,而没有往JDK集合抽象中硬塞其他概念.作为一般规则,Guava集合非常精准地遵循了JDK接口契 ...

  3. Python学习笔记:set集合类型所有方法汇总

    ################################################## 集合的作用是:# 1.获得两个集合之间某种关系的集合(比如求两个集合的交集)# 2.计算集合之间的 ...

  4. [Google Guava]学习--新集合类型Multiset

    Guava提供了一个新集合类型Multiset,它可以多次添加相等的元素,且和元素顺序无关.Multiset继承于JDK的Cllection接口,而不是Set接口. Multiset主要方法介绍: a ...

  5. Guava学习笔记目录

    Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libra ...

  6. [Guava学习笔记]Collections: 不可变集合, 新集合类型

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3843386.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  7. Guava新增集合类型-Multimap

    Guava新增集合类型-Multimap 在日常的开发工作中,我们有的时候需要构造像Map<K, List<V>>或者Map<K, Set<V>>这样比 ...

  8. Guava新增集合类型-Bimap

    Guava新增集合类型-Bimap BiMap提供了一种新的集合类型,它提供了key和value的双向关联的数据结构. 通常情况下,我们在使用Java的Map时,往往是通过key来查找value的,但 ...

  9. guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用

    guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用 1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection ...

随机推荐

  1. China Mobile 免流原理

    用户添加包头之类(SSR软件),最后连接上了Server. 这个过程因为修改了数据包(混淆)以及服务器使用移动IP. 服务器得到信息后通过计费系统漏洞137 138端口等再返回给用户. 整个过程最重要 ...

  2. struts2DMI(动态方法调用)

    struts2动态方法调用共有三种方式: 1.通过action元素的method属性指定访问该action时运行的方法 <package name="action" exte ...

  3. ZOJ 3804 YY's Minions (简单模拟)

    /* 题意:一个矩阵中有 n*m个宠物,每一个宠物都有一个状态, 1醒着的,0睡着的 X离开的!如果这个宠物(醒着的)的周围醒着的个数>3 || <2它就会睡着, 如果这个宠物(睡着的)的 ...

  4. sqlserver -- 学习笔记(八)体验charindex、stuff 和 for xml path在实际问题中的应用及几个问题的探讨

    写在前面 之前做了个微信端顾客扫码评价员工的功能,除了打分数,还可以打标签. 需要统计分数和统计各个员工每种标签被点击的次数. 后来加了个要求,需要查看客户对某个员工一次服务所打出的标签组合.  在不 ...

  5. 有关PHP、HTML单引号、双引号转义以及转成HTML实体的那些事!

    一.单引号和双引号转义在PHP的数据存储过程中用得比较多,即往数据库里面存储数据时候需要注意转义单.双引号: 先说几个PHP函数: 1.addslashes — 使用反斜线引用(转义)字符串: 返回字 ...

  6. Oracle RMAN 备份一例

    Oracle RMAN备份一例: Solaris 10 + Oracle 11.2.0.3 Shell:csh,安装有bash,脚本调用bash 备份策略:周日0级备份,周一~周六1级备份,每6小时备 ...

  7. MAC与HMAC的介绍及其在AWS和Azure中的应用

    MAC 在密码学中,(消息认证码)Message Authentication Code是用来认证消息的比较短的信息.换言之,MAC用来保证消息的数据完整性和消息的数据源认证. MAC由消息本身和一个 ...

  8. 30天C#基础巩固-----序列化,集合

    关于集合的练习. ----->计算字符串每个字符出现的次数. Console.WriteLine("请输入?"); string input = Console.ReadLi ...

  9. RAID一个硬盘FAIL。

    周六本想清静学习一下,刚把咖啡冲好还没有来得及坐下,机房却传来让人心揪的报警声,原来一台服务器一个硬盘FAIL(挂了...... 抽换好的一个容量大小的SCSI硬盘,再次进入这个介面,选择Force ...

  10. .NET Core 单元测试 MSTest

    .NET Core 单元测试 MSTest ,MSTest Framework 已经支持 .NET Core RC2 / ASP.NET Core RC2. 之前都是使用 xUnit.net ,现在 ...