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

java代码(5) ---guava之Multiset的更多相关文章

  1. java代码之美(5)---guava之Multiset

    guava之Multiset 一.概述 Guava提供了一个新集合类型Multiset,它可以多次添加相等的元素,且和元素顺序无关.Multiset继承于JDK的Cllection接口,而不是Set接 ...

  2. 使用 Google Guava 美化你的 Java 代码

    文章转载自:http://my.oschina.net/leejun2005/blog/172328 目录:[ - ] 1-使用 GOOGLE COLLECTIONS,GUAVA,STATIC IMP ...

  3. java代码之美(3)---guava 复写Object常用方法

    guava 复写Object常用方法 Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,这个库提供用于集合,缓存,支持原语,并发性,常见注解,字符串处理,I/O和验证的实用方 ...

  4. 使用 Google Guava 美化你的 Java 代码:1~4 【转】

    文章转载自:http://my.oschina.net/leejun2005/blog/172328 1.使用Google Collections,Guava,static imports编写漂亮代码 ...

  5. java代码(3)----guava复写Object常用方法

    guava复写Object常用方法 Guava是一个Google的基于java1.6的类库集合的扩展项目,这个库提供用于集合,缓存,支持原语,并发性,字符串处理,I/O和验证的实用方法, 这些高质量的 ...

  6. Linkedin工程师是如何优化他们的Java代码的(转)

    英文原文:LinkedIn Feed: Faster with Less JVM Garbage 最近在刷各大公司的技术博客的时候,我在Linkedin的技术博客上面发现了一篇很不错博文.这篇博文介绍 ...

  7. 像写C#一样编写java代码

    JDK8提供了非常多的便捷用法和语法糖,其编码效率几乎接近于C#开发,maven则是java目前为止最赞的jar包管理和build工具,这两部分内容都不算多,就合并到一起了. 愿编写java代码的过程 ...

  8. java代码之美(11)---java代码的优化

    java代码的优化 随着自己做开发时间的增长,越来越理解雷布斯说的: 敲代码要像写诗一样美.也能理解有一次面试官问我你对代码有洁癖吗? 一段好的代码会让人看就像诗一样,也像一个干净房间会让人看去很舒服 ...

  9. Linkedin工程师是如何优化他们的Java代码的

    http://greenrobot.me/devpost/java-faster-less-jvm-garbage/ Linkedin工程师是如何优化他们的Java代码的 最近在刷各大公司的技术博客的 ...

随机推荐

  1. C++内存管理学习笔记(1)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  2. Windows基础学习

    0x01 常用的端口 HTTP协议代理服务器常用端口号:80/8080/3128/8081/9098SOCKS代理协议服务器常用端口号:1080FTP(文件传输)协议代理服务器常用端口号:21Teln ...

  3. Rx-Volley 自己来封装

    自从15年接触了RxJava,对函数式编程越发的喜爱.以前Android项目上网络层都是统一的使用Volley,已经对网络请求的回调,多个回调嵌入各种不爽了,趁着年前任务轻松,赶紧的将Volley封装 ...

  4. orcle增删改操作及alter修改表字段操作

    orcle增删改操作:操作前确保当前用户有增删改的权限. --创建表 create table itcast( pid ), pname ) ); drop table itcast; --复制表 c ...

  5. Python 常用编码规范

    一.简明概述 1.编码 如无特殊情况, 文件一律使用 UTF-8 编码 如无特殊情况, 文件头部必须加入#-*-coding:utf-8-*-标识 2.代码格式 2.1.缩进 统一使用 4 个空格进行 ...

  6. React-Router4 按需加载的4种实现

    其实几种实现都是近似的,但具体上不太一样,其中有些不需要用到bundle-loader 第一种:ReactTraining/react-router 介绍的基于 webpack, babel-plug ...

  7. 3.9 Go Slice切片

    3.9 Go Slice切片 Go语言切片(Slice) 切片是可动态变化的序列,是对数组的引用,引用类型,遵循引用传递的机制 slice类型写作[ ]T,T是slice元素类型,var s1 []i ...

  8. orcle报错:ORA-12737:Instant Client Light:unsupported server character set ZHS16GBK

    我们用Navacat连接Oracle数据库的时候,会提示ORA-12737:Instant Client Light:unsupported server character set ZHS16GBK ...

  9. jquery.min.js v1.10.3版本autocomplete方法会在text前添加搜索出多少项的文本信息 要去除

    http://stackoverflow.com/questions/13011127/how-to-remove-change-jquery-ui-autocomplete-helper-text ...

  10. 8.8SQL Server数据类型介绍1

    image类型:存储二进制字节数组. (相当于C#中的byte[]字节类型) sql server常用的数据类型 1.image类型,用来存储byte[](字节). 2.字符串类型 char ncha ...