今天谈谈Guava类库中的Multisets数据结构,虽然它不怎么经常用,但是还是有必要对它进行探讨。我们知道Java类库中的Set不能存放相同的元素,且里面的元素是无顺序的;而List是能存放相同的元素,而且是有顺序的。而今天要谈的Multisets是能存放相同的元素,但是元素之间的顺序是无序的。从这里也可以看出,Multisets肯定不是实现Java中Set接口的,因为Set接口是不能存放相同的元素!Java中的Set 里面的元素有点像 :[A, C, B],而 Multiset 会是这样 : [A × 2, C × 3, B × 5],这个是有区别的。
在以前,如果我们需要统计一篇文章中各个单词出现的次数,我们可能用下面的方法来实现:
public void wordCounts(List<String> words) { 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); } } }
如果我们需要得到某个单词(比如good)的出现次数,我们可能这么写:
int goodCount = counts.get("good");
很麻烦对吗?而且Map中的get(E key)的含义都不那么明显。那如果我们用Multisets来看看:
int goodCount= countMultiset .count(“good”);
在Multiset中提供了一个count(Object element)方法,得到某个对象在Multiset中出现的次数,这个显然比在Map里面调get的可读性好多了,不是吗?
注意:
Multiset提供setCount(E, int)方法,可以修改元素E在Multiset中的次数,但是不能把元素出现的次数修改为负数和大于Integer.MAX_VALUE的值。否则将会抛出异常
countMultiset .setCount("good", Integer.MAX_VALUE + 1); //或 countMultiset .setCount("good", -1);
将会抛出以下异常:
Exception in thread "main" java.lang.IllegalArgumentException: count cannot be negative: -2147483648(-1) at com.google.common.base.Preconditions.checkArgument(Preconditions.java:119) at com.google.common.collect.Multisets.checkNonnegative(Multisets.java:1061) at com.google.common.collect.AbstractMapBasedMultiset.setCount(AbstractMapBasedMultiset.java:265) at com.google.common.collect.HashMultiset.setCount(HashMultiset.java:34) at com.wyp.test.testFiles(test.java:150) at com.wyp.test.main(test.java:156)
因为在Multiset中setCount先会判断所设置数据的状态
static void checkNonnegative(int count, String name) { checkArgument(count >= 0, "%s cannot be negative: %s", name, count); }
可以看出,count是int类型的,最大的值为Integer.MAX_VALUE,在其基础只上加上1将会变成负数,所以不行。
Multiset也不是Map<E, Integer>类型的结构, 我们可以用Map<E, Integer>来实现Multiset,但是利用Map<E, Integer>实现Multiset和Google guava的实现还是有很大的区别的,主要表现如下:
- Multiset中的元素出现的次数只能为正数,前面说了原因。如果E的出现次数为0,那么E将不出现在multiset中,是不能在elementSet()和entrySet()的视图中;
- multiset.size()返回这个集合的大小,相当于在multiset中元素的出现的总数。如果想得到multiset中不同元素出现的总数,可以利用elementSet().size()来实现;
- multiset.iterator()可以遍历multiset中的所有元素,所以iteration遍历的次数就等于multiset.size();
- Multiset支持添加、删除元素,设置元素出现的次数;setCount(elem, 0)相当于移除elem的所有元素;
- multiset.count(elem)方法中的elem如果没有出现在Multiset中,那么它的返回值永远都是0。
常用的实现了Multiset 接口的类有:
- HashMultiset: 元素存放于 HashMap
- LinkedHashMultiset: 元素存放于 LinkedHashMap,即元素的排列顺序由第一次放入的顺序决定
- TreeMultiset:元素被排序存放于TreeMap
- EnumMultiset: 元素必须是 enum 类型
- ImmutableMultiset: 不可修改的 Mutiset
相关推荐
guava-API文档
Google Guava Collections 是 Java Collections Framework 的一个强大且实用的非官方扩展 API。它由 Google 工程师 Kevin Bourrillion 和 Jared Levy 在著名的“20%”时间开发而成,并得到了 Java Collections ...
下面我们就开启优雅Java编程学习之旅! 项目相关信息: 官方首页:http://code.google.com/p/guava-libraries 官方下载:http://code.google.com/p/guava-libraries/downloads/list 官方文档:...
自2011年以来,Guava Collections不断更新和完善,成为Java开发者中备受推崇的工具库之一。 #### 二、目标读者与前置知识 Guava Collections的目标读者应当具备基础的Java知识,特别是对JDK5特性的理解和运用能力...
包含翻译后的API文档:guava-20.0-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:com.google.guava:guava:20.0; 标签:google、guava、jar包、java、中英对照文档; 使用方法:解压翻译后的API文档,用...
guava类似Apache Commons工具集包含了若干被Google的 Java项目广泛依赖 的核心库
通过以上对Guava常用API的介绍,我们可以看出Guava库的强大之处在于它为Java开发提供了许多实用工具和优化,帮助我们编写出更高效、更易于维护的代码。在实际开发中,合理利用Guava能显著提升代码质量,提高开发效率...
包含翻译后的API文档:guava-18.0-javadoc-API文档-中文(简体)版.zip 对应Maven信息:groupId:com.google.guava,artifactId:guava,version:18.0 使用方法:解压翻译后的API文档,用浏览器打开“index.html”...
Guava 23.0 API CHM格式,可以搜索,方便离线查阅。
包含翻译后的API文档:guava-23.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.google.guava:guava:23.0; 标签:google、guava、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开...
Guava 中文是石榴的意思,该项目是 Google 的一个开源项目,包含许多 Google 核心的 Java 常用库。 目前主要包含: com.google.common.annotations com.google.common.base com.google.common.collect ...
包含翻译后的API文档:guava-17.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.google.guava:guava:17.0; 标签:google、guava、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开...
包含翻译后的API文档:guava-20.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.google.guava:guava:20.0; 标签:google、guava、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开...
包含翻译后的API文档:guava-19.0-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:com.google.guava:guava:19.0; 标签:google、guava、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用...
包含翻译后的API文档:guava-28.0-android-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.google.guava:guava:28.0-android; 标签:google、guava、中文文档、jar包、java; 使用方法:解压翻译后的API文档,...
guava19_api_chm英文文档
包含翻译后的API文档:guava-19.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.google.guava:guava:19.0; 标签:google、guava、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开...
包含翻译后的API文档:guava-30.1.1-jre-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:com.google.guava:guava:30.1.1-jre; 标签:google、guava、中英对照文档、jar包、java; 使用方法:解压翻译后...
包含翻译后的API文档:guava-16.0.1-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.google.guava:guava:16.0.1; 标签:google、guava、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开...