Java-TreeMap和Guava-HashMultiset
一、Java-TreeMap
1.数据结构
底层数据结构是裸的红黑树,保证元素有序,没有比较器Comparator的情况按照key的自然排序,可自定义比较器。线程不安全。
可以存null,但是key不可以为null。
2.性能分析:空间换时间
增删改查的时间复杂度都是O(log n),HashMap的时间复杂度则是O(1),但是相比HashMap,TreeMap没有多余的空间,也没有负载因子。
2.几个查找方法
- boolean containsValue(Object value):判断该TreeMap中是否包含有关指定value的映射
- Map.Entry<K, V> firstEntry():返回该TreeMap的第一个(最小的)映射
- K firstKey():返回该TreeMap的第一个(最小的)映射的key
- Map.Entry<K, V> lastEntry():返回该TreeMap的最后一个(最大的)映射
- K lastKey():返回该TreeMap的最后一个(最大的)映射的key
- SortedMap<K, V> headMap(K toKey):返回该TreeMap中严格小于指定key的映射集合
- SortedMap<K, V> subMap(K fromKey, K toKey):返回该TreeMap中指定范围的映射集合(大于等于fromKey,小于toKey)
- Object ceilingKey(Object key);返回大于或等于给定键的最小键,如果没有这样的键则返回null
- Object higherKey(Object key);返回严格大于指定键的最小键,没有则返回null
3.遍历
for (Map.Entry entry : treeMap.entrySet()) {
System.out.println(entry);
}
Iterator iterator = treeMap.entrySet().iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
4.刷题杀招
- Object ceilingKey(Object key);返回大于或等于给定键的最小键,如果没有这样的键则返回null
- Object higherKey(Object key);返回严格大于指定键的最小键,没有则返回null
- V getOrDefault(Object key, V defaultValue); 如果存在value则返回value,如果没有则返回defaultValue
map.put(key, map.getOrDefault(key,0)+1); 若有key则返回key的数量,如果没有则返回0,put的时候设置为1,达到对key计数的效果,相当于维护一个有序、可重复集合!
/** 456. 132模式
* 求是否存在子序列a[i],a[j],a[k]
* i<j<k
* a[i]<a[k]<a[j]
* n<1e4 a[i]<1e9
* 遍历数组,将遍历到的每个数当a[j]处理
* 不看数组元素大小,只要遍历到的数在中间,就先满足了下标
* 左边[0,j-1]是判断a[i]的,a[i]是最小的,那么就维护一个最小值
* 右边[j+1,n-1]是判断a[k]的,a[k]是次小值,那就找比a[i]大一点点即可,再与a[j]比较
*/
public boolean find132pattern(int[] a) {
int n=a.length;
if(n<3)
return false;
int minn=a[0];
TreeMap<Integer,Integer> map=new TreeMap<>();
for(int k=2;k<n;k++){
map.put(a[k], map.getOrDefault(a[k],0)+1);
/**
* map.getOrDefault(a[k],0)表示,如果a[k]存在就返回a[k]的值,否则返回0
*一开始必然是返回0,设置value为1,随后逐渐增多,达到计数效果
*/
}
Integer ak=null;
for(int j=1;j<n-1;j++){
if(minn<a[j]){
ak=map.higherKey(minn);
if(ak!=null && ak<a[j]){
return true;
}
}
minn=Math.min(minn,a[j]);
if(map.get(a[j+1])==1){
map.remove(a[j+1]);
}else{
map.put(a[j+1],map.get(a[j+1])-1);
}
}
return false;
}
二、Guava-HashMultiset
参考:https://www.cnblogs.com/qdhxhz/p/9410898.html
Guava是Goolge的库,不是jdk的,补充了一些集合类功能的不足。
1.先导入依赖包
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.0-jre</version>
</dependency>
2.Multiset用法
Multiset是一个接口,没有实现java.util.Set接口,Set规定不可以放入相同元素,如果放入相同元素会被覆盖,Multiset相对于Set,可以添加相同元素。
- Multiset<Integer> set = HashMultiset.create();//创建方式不是用new
- add(E e)//添加一个元素e
- add(E e, int x)//添加x个元素e
- remove(E e)//删除一个元素e
- remove(E e, int x)//删除x个元素e
- elementSet()//将不同的元素放入一个Set中
- count(E e)//返回元素e的个数
- setCount(E e ,int x)//指定集合里有x个元素e
- setCount(E e,int x,int y)//如果恰好有x个e,则变为y,否则方法无效
- retainAll(Collection c)//保留出现在给定集合参数的所有的元素,其他都不要
- removeAll(Collection c)//去除出现给给定集合参数的所有的元素,有就去掉,没有不用管
- size()//所有元素总个数
3.常用的实现了Multiset 接口的类
- HashMultiset: 元素存放于 HashMap(决定了无序性)
- LinkedHashMultiset: 元素存放于 LinkedHashMap,即元素的排列顺序由第一次放入的顺序决定
- TreeMultiset:元素被排序存放于TreeMap
- EnumMultiset: 元素必须是 enum 类型
- ImmutableMultiset: 不可修改的 Mutiset
4.遍历
System.out.println("--遍历全部元素,包括重复的---");
while(iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("--只遍历key,不重复---");
for(Integer key: set.elementSet()){
System.out.println("key="+key+" cnt="+set.count(key));
}
Java-TreeMap和Guava-HashMultiset的更多相关文章
- Future 异步回调 大起底之 Java Future 与 Guava Future
目录 写在前面 1. Future模式异步回调大起底 1.1. 从泡茶的案例说起 1.2. 何为异步回调 1.2.1. 同步.异步.阻塞.非阻塞 1.2.2. 阻塞模式的泡茶案例图解 1.2.3. 回 ...
- 从Java future 到 Guava ListenableFuture实现异步调用
从Java future 到 Guava ListenableFuture实现异步调用 置顶 2016年04月24日 09:11:14 皮斯特劳沃 阅读数:17570 标签: java异步调用线程非阻 ...
- Java TreeMap 和 LinkedHashMap【笔记】
Java TreeMap 和 LinkedHashMap[笔记] TreeMap TreeMap基本结构 TreeMap 底层的数据结构就是红黑树,和 HashMap 的红黑树结构一样 与HashMa ...
- Google Java编程库Guava介绍
本系列想介绍下Java下开源的优秀编程库--Guava[ˈgwɑːvə].它包含了Google在Java项目中使用一些核心库,包含集合(Collections),缓存(Caching),并发编程库(C ...
- [Java 缓存] Java Cache之 Guava Cache的简单应用.
前言 今天第一次使用MarkDown的形式发博客. 准备记录一下自己对Guava Cache的认识及项目中的实际使用经验. 一: 什么是Guava Guava工程包含了若干被Google的 Java项 ...
- Google的Java常用类库 Guava资料
java的人应该都知道Apache commons的java常用类库吧,这个Guava和commons一样,封装出一套比jdk本身提供的常用类库强大.既然有了这个这么强大的类库,我们就没必要重复造轮子 ...
- java TreeMap用法
转自:http://huchenqiang90.blog.163.com/blog/static/11250080020101025956498/ 最近工作遇到需要按一个model中不同的列进行排序的 ...
- Java经典类库-Guava中的函数式编程讲解
如果我要新建一个java的项目,那么有两个类库是必备的,一个是junit,另一个是Guava.选择junit,因为我喜欢TDD,喜欢自动化测试.而是用Guava,是因为我喜欢简洁的API.Guava提 ...
- Java TreeMap 源码解析
继上篇文章介绍完了HashMap,这篇文章开始介绍Map系列另一个比较重要的类TreeMap. 大家也许能感觉到,网络上介绍HashMap的文章比较多,但是介绍TreeMap反而不那么多,这里面是有原 ...
- [Java] TreeMap - 源代码学习笔记
TreeMap 实现了 SortedMap 和 NavigableMap 接口,所有本文还会记录 SortedMap 和 NavigableMap 的阅读笔记. SortedMap 1. 排序的比较应 ...
随机推荐
- NoSQL 数据库案例实战 -- MongoDB数据备份、恢复
MySQL数据迁移到MongoDB数据库中 前言 一.数据备份 二.数据恢复 前言 本环境是基于 Centos 7.8 系统构建mongodb-enterprise-4.2.8学习环境具体构建,请参考 ...
- React Hooks & React v16.8.6
React Hooks Hooks are a new addition in React 16.8 const [state, setState] = useState(initialState); ...
- c++ winapi 让目标程序(target)调用当前程序(local)的函数
GameCheat 如果你的目标程序是x86/x64, 那么当前程序也需要编译为x84/x64 #include <iostream> #include <string> #i ...
- NGK的内存为何如此的火爆?
要说最近最受关注的公链,当属NGK了.NGK代币在迎来43倍暴涨之后似乎进入了一个平板期,这让很多投资者的热情冷却了一半,就在大家以为对NGK放弃信心时,NGK又突然爆出了一个新的炒作点:NGK内存( ...
- [Python] 茎叶图和复合饼图的画法
目录 茎叶图 复合饼图 茎叶图 from itertools import groupby nums2=[225, 232,232,245,235,245,270,225,240,240,217,19 ...
- 1098 Insertion or Heap Sort——PAT甲级真题
1098 Insertion or Heap Sort According to Wikipedia: Insertion sort iterates, consuming one input ele ...
- vue:子组件通过调用父组件的方法的方式传参
在本案例中,由于子组件通过调用父组件的方法的方式传参,从而实现修改父组件data中的对象,所以需要啊使用$forceUpdate()进行强制刷新 父组件: provide() { return { s ...
- Spring Cloud基础
1.网站架构演变过程 传统架构(单点应用SSM或SSH)→分布式架构(项目拆分)→SOA架构(面向服务架构)→微服务架构 2.微服务概述 2.1SOA架构 面向服务的架构(SOA)是一个组件模型,它将 ...
- 永远不要眼高手低,Vue完整实现一套简单的增删改查CURD操作
1: 永远不要眼高手低,看起来很简单,但是你从来没有去动手试一下,就不知道其中真正需要注意的许多细节, 2:完整code如下: 1 <!DOCTYPE html> 2 <html l ...
- 为WebView 同步cookie
import android.os.Build;import android.text.TextUtils;import android.webkit.CookieManager;import and ...