Guava - Set集合
当我们在统计一个字符串中每个单词出现的次数时,通常的做法是分割字符串,遍历字符串,然后放到一个map里面,来进行统计,Guava中提供了类似功能的集合,Multiset
String strWorld="wer dffd ddsa dfd dreg de dr ce ghrt cf gt ser tg ghrt cf gt " +
"ser tg gt kldf dfg vcd fg gt ls lser dfr wer dffd ddsa dfd dreg de dr " +
"ce ghrt cf gt ser tg gt kldf dfg vcd fg gt ls lser dfr";
List<String> stringList = Splitter.on(" ")
.trimResults()
.splitToList(strWorld);//把字符串转换为集合
HashMultiset<String> multisets = HashMultiset.create();//创建一个Multiset集合
multisets.addAll(stringList);
Iterator<String> iterator = multisets.iterator();
while (iterator.hasNext()){
String next = iterator.next();
System.out.println(next+" count: "+multisets.count(next));
}
代码如此简洁清晰。
实现逻辑
内部使用Map进行实现,
HashMultiset.create()
public final class HashMultiset<E> extends AbstractMapBasedMultiset<E>
public static <E> HashMultiset<E> create() {
return new HashMultiset();
}
private HashMultiset() {
super(new HashMap());
}
... ...
}
abstract class AbstractMultiset<E> extends AbstractCollection<E> implements Multiset<E> {
public boolean add(@Nullable E element) {
this.add(element, 1);
return true;
}
}
AbstractMapBasedMultiset
abstract class AbstractMapBasedMultiset<E> extends AbstractMultiset<E> implements Serializable {
private transient Map<E, Count> backingMap;
private transient long size;
@GwtIncompatible
private static final long serialVersionUID = -2250766705698539974L;
protected AbstractMapBasedMultiset(Map<E, Count> backingMap) {
this.backingMap = (Map)Preconditions.checkNotNull(backingMap);
this.size = (long)super.size();
}
public int add(@Nullable E element, int occurrences) {
if(occurrences == 0) {
return this.count(element);
} else {
Preconditions.checkArgument(occurrences > 0, "occurrences cannot be negative: %s", occurrences);
Count frequency = (Count)this.backingMap.get(element);
int oldCount;
if(frequency == null) {
oldCount = 0;
this.backingMap.put(element, new Count(occurrences));
} else {
oldCount = frequency.get();
long newCount = (long)oldCount + (long)occurrences;
Preconditions.checkArgument(newCount <= 2147483647L, "too many occurrences: %s", newCount);
frequency.add(occurrences);
}
this.size += (long)occurrences;
return oldCount;
}
}
... ...
}
Guava - Set集合的更多相关文章
- Guava新增集合类型-Bimap
Guava新增集合类型-Bimap BiMap提供了一种新的集合类型,它提供了key和value的双向关联的数据结构. 通常情况下,我们在使用Java的Map时,往往是通过key来查找value的,但 ...
- Guava新增集合类型-Multimap
Guava新增集合类型-Multimap 在日常的开发工作中,我们有的时候需要构造像Map<K, List<V>>或者Map<K, Set<V>>这样比 ...
- Guava新增集合类型-Multiset
Guava新增集合类型-Multiset Guava引进了JDK里没有的,但是非常有用的一些新的集合类型.所有这些新集合类型都能和JDK里的集合平滑集成.Guava集合非常精准地实现了JDK定义的接口 ...
- Guava学习笔记:Guava新集合-Table等
Table 当我们需要多个索引的数据结构的时候,通常情况下,我们只能用这种丑陋的Map<FirstName, Map<LastName, Person>>来实现.为此Guava ...
- Guava学习笔记:Guava新增集合类型-Bimap
BiMap提供了一种新的集合类型,它提供了key和value的双向关联的数据结构. 通常情况下,我们在使用Java的Map时,往往是通过key来查找value的,但是如果出现下面一种场景的情况,我们就 ...
- Guava学习笔记:Guava新增集合类型-Multimap
在日常的开发工作中,我们有的时候需要构造像Map<K, List<V>>或者Map<K, Set<V>>这样比较复杂的集合类型的数据结构,以便做相应的业 ...
- Guava学习笔记:Guava新增集合类型-Multiset
Guava引进了JDK里没有的,但是非常有用的一些新的集合类型.所有这些新集合类型都能和JDK里的集合平滑集成.Guava集合非常精准地实现了JDK定义的接口.Guava中定义的新集合有: Multi ...
- guava学习--集合2&Range
转载:http://www.cnblogs.com/peida/p/Guava_ImmutableCollections.html Table: 当我们需要多个索引的数据结构的时候,通常情况下,我们只 ...
- Guava 3: 集合Collections
一.引子 Guava 对JDK集合的拓展,是最成熟且最受欢迎的部分.本文属于Guava的核心,需要仔细看. 二.Guava 集合 2.1 Immutable Collections不可变集合 1.作用 ...
- guava -- 新集合类型
Guava引入了很多JDK没有的.但有用的新集合类型.这些新类型是为了和JDK集合框架共存,而没有往JDK集合抽象中硬塞其他概念. 作为一般规则,Guava集合非常精准地遵循了JDK接口契约. 1. ...
随机推荐
- 正则表达式re模块的基础及简单应用
一.re的简介 re模块是python独有的匹配字符串的模块 该模块中的很多功能是基于正则表达式实现 二.正则表达式的基础语法 元字符 匹配内容说明 . 匹配除换行符以外的任意字符 \w 匹配字母或数 ...
- P4779 【模板】单源最短路径(标准版)单源最短路Dijkstra
题目描述 给定一个$n$个点,$m$条有向边的带非负权图,请你计算从$s$出发,到每个点的距离. 数据保证你能从$s$出发到任意点. 输入格式 第一行为三个正整数$n,m,s$. 第二行起$m$行,每 ...
- 『言善信』Fiddler工具 — 13、Fiddler断点功能的使用详解
目录 1.Fiddler断点的应用 2.断点的分类 3.设置全局断点 (1)设置before Requests全局断点: (2)设置After Responses全局断点: 4.设置局部断点 (1)设 ...
- c语言经典算法---计算Fibonacci数列
算法是一个程序和软件的灵魂,作为一名优秀的程序员,只有对一些基础的算法有着全面的掌握,才会在设计程序和编写代码的过程中显得得心应手.下面我就分享一个C语言中比较基础却极为重要的一个算法----计算Fi ...
- Redis五种基础与三种高级数据结构解析
记得点赞+关注呦. 前言 在 Redis 最重要最基础就属 它丰富的数据结构了,Redis 之所以能脱颖而出很大原因是他数据结构丰富,可以支持多种场景.并且 Redis 的数据结构实现以及应用场景在面 ...
- 空指针的解决方案Optional包装类
有道云笔记地址 (建议有道云打开,markdown文档,直接拷贝过来有一些问题) 引言 在java的开发中,有一个问题始终会伴随着开发的进程.记得我第一个项目的时候,有一个同事在评论我的代码的时候说到 ...
- 【Python报错】ValueError: If using all scalar values, you must pass an index
问题: 1.ValueError: If using all scalar values, you must pass an index.意思是:如果使用所有标量值,则必须传递索引 2.再看错误发生代 ...
- Netty 框架学习 —— 单元测试
EmbeddedChannel 概述 ChannelHandler 是 Netty 程序的关键元素,所以彻底地测试它们应该是你的开发过程中的一个标准部分,EmbeddedChannel 是 Netty ...
- OO unit4 summary
Unit4 一.第四单元作业的架构设计 第四单元个人认为主要是考察对于层次结构的理解,即如何理解并处理好UML图的树状结构组织,在理好层次之间以及层次内部的相互关系之后,就只剩下代码实现的问题了.但是 ...
- 基于SpringBoot 、AOP与自定义注解转义字典值
一直以来,前端展示字典一般以中文展示为主,若在表中存字典值中文,当字典表更改字典值对应的中文,会造成数据不一致,为此设置冗余字段并非最优方案,若由前端自己写死转义,不够灵活,若在业务代码转义,臃肿也不 ...