继续这次番石榴之旅,我们到达了Multiset 。 我可能不像Multimaps或Bimaps那样使用它,但是它确实有它的用途。

那么什么是多重集?

也许您可以猜到它是一个可以容纳同一对象的多个实例的集合。

这不仅仅是列表吗?

在Java中,列表和集合之间有两个基本区别。 列表可以保存同一对象的重复项,并且列表始终是有序的。 集合不能保存重复项,并且不能通过Set接口保证顺序。 (某些实现– LinkedHashSet,SortedSet等–当然可以提供有保证的顺序!)

因此,多集在列表和集之间占据了某种灰色区域。 允许重复,但不能保证订单。

这个集合有时也称为Bag ,实际上,这就是Apache Commons Collections称之为Mutlisets的东西。

那我要用什么呢?

关于多集的妙处在于,它们可以跟踪集合中每个特定对象的计数。 因此,您可以使用它们来计数东西。 您是否曾经编写过如下代码:

Map<MyClass,Integer> objectCounts = new HashMap<MyClass,Integer>();public void incrementCount(MyClass obj) {Integer count = objectCounts.get(obj);if (count == null) {objectCounts.put(obj,0);} else {objectCounts.put(obj,count++);}
}public int getCount(MyClass obj) {Integer count = objectCounts.get(obj);if (count == null) {return 0;} else {return count;}
}

有点笨拙? 让我们看看如何使用多集集:

Multiset<MyClass> myMultiset = HashMultiset.create();MyClass myObject = new MyClass();myMultiset.add(myObject);
myMultiset.add(myObject);  // add it a second time.System.out.println(myMultiset.count(myObject)); // 2myMultiset.remove(myObject);
System.out.println(myMultiset.count(myObject)); // 1

如您所见,这要简单得多! 甚至可以一次添加/删除多个对象

Multiset<MyClass> myMultiset = HashMultiset.create();MyClass myObject = new MyClass();
myMultiset.add(myObject,5); // Add 5 copies of myObjectSystem.out.println(myMultiset.count(myObject)); // 5myMultiset.remove(myObject,2); // remove 2 copiesSystem.out.println(myMultiset.count(myObject)); // 3

很有用吗? 与往常一样,根据您的要求有几种可用的实现,我建议您看一下API: http : //docs.guava-libraries.googlecode.com/git-history/v9.0/javadoc/com/google/common /collect/Multiset.html

参考: Tom's编程博客博客中的JCG合作伙伴 Tom Jefferys提供的Google Guava Multisets 。

翻译自: https://www.javacodegeeks.com/2012/12/google-guava-multisets.html

Google Guava多集相关推荐

  1. Google Guava 工具集__3__ Ordering犀利的比较器 Object方法

    Google Guava 工具集 博客栏目链接:Google Guava 博客栏目 博客栏目涉及演示代码 GitHub 地址: 点击打开Guava 演示代码包 Ordering是Guava类库提供的一 ...

  2. 工作实践 之 Google Guava 工具集的使用 ,提高效率

    Google Guava是什么? Google Guava 工程包含了若干被Google的java项目广泛依赖的核心库,例如:集合,缓存,原生类型支持,并发库,通用注解,字符串,I/O等等.所有这些工 ...

  3. [Google Guava] 2.4-集合扩展工具类

    原文链接 译文链接 译者:沈义扬,校对:丁一 简介 有时候你需要实现自己的集合扩展.也许你想要在元素被添加到列表时增加特定的行为,或者你想实现一个Iterable,其底层实际上是遍历数据库查询的结果集 ...

  4. [Google Guava] 1.1-使用和避免null

    原文链接 译文链接 译者: 沈义扬    Doug Lea 说,"Null 真糟糕."   当Sir C. A. R. Hoare 使用了null引用后说,"使用它导致了 ...

  5. [Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具

    原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.G ...

  6. 谷歌guava_使用Google Guava进行馆藏创建和不变性

    谷歌guava 因此,我想看看番石榴提供的一些集合创建模式,以及它提供的某些不可变集合类型. 如果您没有看过我以前的文章,则可能要从这里开始: 番石榴第1部分– MultiMaps 番石榴第2部分– ...

  7. Google Guava MultiMaps

    番石榴 这是系列文章中的第一篇,我将尝试解释和探索Google很棒的Guava java库 . 我在搜索Apache Commons Collections的通用版本时遇到了番石榴(Guava)–我需 ...

  8. java本地缓存 google guava

    本地缓存产生背景: 本地缓存是指在我们本地的物理空间开辟出一片物理空间,专门用来存储我们需要向服务器端频繁需要的数据, 比如前端页面需要频繁的向后台访问某些数据,这时候我们每次都去数据库查找数据再返回 ...

  9. 多级缓存之Google Guava的实现方案

    文章目录 背景 如何创建? pom引入依赖 CacheLoader方式 何时使用? 案例 CacheBuilder 的详细方法 Callable方式 何时使用? 案例 如何删除? 被动 基于数据大小的 ...

最新文章

  1. V神再为BCH发声!
  2. druid seata 配置_分布式事务解决方案——Seata使用
  3. es任务 如何kill_kill进程的方法
  4. React Native调用原生模块
  5. java.lang包中的常用类
  6. 【论文解读】CVPR 2021 妆容迁移 论文+ 代码 汇总,美得很美得很!
  7. SVN、Apache和AD LDS的集成
  8. VirtualBox中的网络连接方式详解
  9. 从无到有整合SpringMVC-MyBatis项目(1):搭建JavaWeb项目
  10. python中快速删除实例对象中的所有属性
  11. FeelYourSound Chillout Engine Pro for Mac - MIDI文件生成插件
  12. VS2010 安装OpenCV2.4.0教程
  13. 【光学】基于matlab模拟单缝夫琅禾费衍射
  14. Java—核心技术类的封装、继承与多态
  15. 用python生成密码本(不同模式不同密码)
  16. 研究生英语面试常见问题及回答
  17. 微信小程序入门---01
  18. pion:rtc-to-webrtc示例
  19. 东南大学洪伟教授评述:毫米波与太赫兹技术
  20. 人工智能为代表的新一轮科技革命和产业变革正在重构全球创新版图

热门文章

  1. python自动配置文件_【python接口自动化】- ConfigParser配置文件的使用
  2. webpack打包器小结(1)
  3. tomcat(20)基于JMX的管理
  4. GET与POST传递数据的最大长度能够达到多少
  5. 纯注解开发配置spring
  6. 子类重写父类变量_为什么在子类中不重写超类的实例变量
  7. jaxb xml配置_JAXB和Log4j XML配置文件
  8. grunt 插件_从Grunt测试Grunt插件
  9. MicroProfile 2.2 BOM导入支持
  10. 您自己的MicroProfile Config来源