RangeSet类是用来存储一些不为空的也不相交的范围的数据结构。假如需要向RangeSet的对象中加入一个新的范围,那么任何相交的部分都会被合并起来,所有的空范围都会被忽略。

  讲了这么多,我们该怎么样利用RangeSet?RangeSet类是一个接口,需要用它的子类来声明一个RangeSet型的对象,实现了RangeSet接口的类有ImmutableRangeSet和TreeRangeSet,ImmutableRangeSet是一个不可修改的RangeSet,而TreeRangeSet是利用树的形式来实现。下面主要谈TreeRangeSet的用法:

import com.google.common.collect.*;/*** User: 过往记忆* Email:wyphao.2007@163.com* Blog: https://www.iteblog.com* Date: 13-7-17* Time: 下午4:10*/public void testRangeSet(){RangeSet rangeSet = TreeRangeSet.create();rangeSet.add(Range.closed(1, 10));System.out.println(rangeSet);rangeSet.add(Range.closedOpen(11, 15));System.out.println(rangeSet);rangeSet.add(Range.open(15, 20));System.out.println(rangeSet);rangeSet.add(Range.openClosed(0, 0));System.out.println(rangeSet);rangeSet.remove(Range.open(5, 10));System.out.println(rangeSet);}

输出:

{[1‥10]}
{[1‥10][11‥15)}
{[1‥10][11‥15)(15‥20)}
{[1‥10][11‥15)(15‥20)}
{[1‥5][10‥10][11‥15)(15‥20)}

注意:RangeSet需要充分利用JDK 1.6中NavigableMap特性,所以JDK1.6以下版本无法使用

1、那如果我们需要遍历rangeSet中的所有元素可以用下面方法实现

public void iteratorRangeSet(RangeSet integerRangeSet) {if(integerRangeSet == null){return;}Set<Range> ranges = integerRangeSet.asRanges();Iterator<Range> iterator = ranges.iterator();while(iterator.hasNext()){Range next = iterator.next();System.out.println(next);}
}

结果:

[1‥5]
[10‥10]
[11‥15)
(15‥20)

2、如果我们需要得到rangeSet互补的范围,我们可以用RangeSet提供的complement()方法,rangeSet.complement()同样是一个RangeSet,其中的元素也是互不相交、且不为空的RangeSet,那么rangeSet的互补集可以像下面这样来写:

RangeSet complement = rangeSet.complement();
System.out.println(complement);

得到的结果是:

{(-∞‥1)(5‥10)(10‥11)[15‥15][20‥+∞)}

正好是rangeSet的互补。

3、如果需要在rangeSet中查询某个元素是否在rangeSet中,可以用contains(C)来实现,其中C extends java.lang.Comparable。比如我想得到上述rangeSet是否包含15,可以这样写:

boolean isIn = rangeSet.contains(15);
System.out.println(isIn);//false,因为上述范围不包含元素15.

4、如果想知道某个元素是在rangeSet中哪个范围里面,可以这样写:

Range integerRange = rangeSet.rangeContaining(17);
System.out.println(integerRange);
//输出(15‥20),因为17被包含在(15‥20)中,所以输出这个范围。

5、如果想知道某个范围是否包含在rangeSet的范围中,可以这样写:

boolean encloses = rangeSet.encloses(Range.closedOpen(18, 20));
System.out.println(encloses);//true.因为范围(18,20)包含在范围(15,20)中
encloses = rangeSet.encloses(Range.closedOpen(5, 20));
System.out.println(encloses);//false.因为范围(5,20)不被rangeSet中任何范围包含.

guava学习:RangeSet相关推荐

  1. Guava学习笔记:简化异常处理的Throwables类

    Guava学习笔记:简化异常处理的Throwables类 参考文章: (1)Guava学习笔记:简化异常处理的Throwables类 (2)https://www.cnblogs.com/peida/ ...

  2. 借Google Guava学习发现和开发通用功能模块

    如何发现通用的功能模块? 很多人觉得做业务开发没有挑战,实际上,做业务开发也会涉及很多非业务功能的开发,比如我们前面讲到的 ID 生成器.性能计数器.EventBus.DI 容器,以及后面会讲到的限流 ...

  3. Google guava学习

    文章目录 Google guava学习 一.摘要 二.优点 三.maven依赖 四.Guava API使用教程 五.GuavaCache本地内存缓存 六.布隆过滤器 Google guava学习 一. ...

  4. Guava学习笔记:EventBus(转)

    EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现.对于事件监听和发布订阅模式,EventBus是一个非常优雅和简单解决方案,我们不用创建复杂的类和 ...

  5. Guava学习笔记:Google Guava 类库简介

    Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libra ...

  6. Guava学习之Joiner

    本文是对 Guava 中 Joiner 的学习介绍.欢迎加入学习项目: LearningGuava. 使用示例 以下参考:官方文档. 开发过程中,用分隔符连接字符串序列可能是一个比较繁琐的过程,但本不 ...

  7. Guava学习笔记(转)

    Guava(瓜娃)学习笔记 Guava工程包含了若干被google的java项目广泛依赖的核心库,例如:集合 [collections] .缓存 [caching] .原生类型支持 [primitiv ...

  8. Guava学习笔记:缘起

    缘起 为什么要使用Guava呢?因为在几年前就是用过Guava的部分功能,当时有一个项目需要通过缓存来提升部分功能的性能,对本地应用缓存和分布式应用缓存进行了相关的调研,在调研本地应用缓存的时候,第一 ...

  9. Guava学习笔记:Preconditions优雅的检验参数

    在日常开发中,我们经常会对方法的输入参数做一些数据格式上的验证,以便保证方法能够按照正常流程执行下去.对于可预知的一些数据上的错误,我们一定要做事前检测和判断,来避免程序流程出错,而不是完全通过错误处 ...

最新文章

  1. Python将classification_report的结论转化为字典(dict)形式并提取模型的灵敏度(sensitivity)、特异度(specificity)、PPV和NPV指标、混淆矩阵图
  2. linux怎么确认oracle已启动,怎么设置在Linux启动后,Oracle也启动,监听也启动
  3. UVA225Golygons 黄金图形
  4. Hadoop学习笔记03_Hive练习
  5. Git:Rebase和Merge之间的区别,看完这篇文章你就懂了!
  6. redis热点key解决方案_缓存穿透,缓存雪崩,4种解决方案分析
  7. 填写【2fpmi2j】
  8. python大作业报告(爬虫 分析 可视化)_python第四次周末大作业
  9. 行业方案|“医疗”行业智能运维解决方案介绍
  10. 光谱共焦传感器在PCB板子上的应用
  11. dB、dBm、dBw和w的换算关系
  12. Mobaxterm 中文输入Backspace按键问题
  13. 双11有哪些好用的降噪蓝牙耳机值得推荐?降噪蓝牙耳机性价比排行
  14. ----已搬运----【总章程】SSRF完全学习,,什么都有,,,原理,绕过,攻击
  15. opencv 通过标定摄像头测量物体大小_解决方案 | 如何用普通手机准确测量物体体积?...
  16. UE4学习笔记#三、蓝图混合空间
  17. oracle SQL认证考试,sql认证(sql server认证考试)
  18. Task 03 python与word
  19. 微信小号全面开放!详细注册流程
  20. 产品材料声学性能质检及其测试方法

热门文章

  1. 苹果手机数据线充不了电_深圳苹果手机数据线多少钱一条
  2. 【高并发】多线程之无锁队列|性能优化
  3. HEIF HEVC 你知道多少?
  4. cok服务器文件,前端开发之Node.js篇——搭建自己的网站服务器文件管理(一)...
  5. AL32UTF8/UTF8(Unicode)数据库字符集含义 (文档 ID 1946289.1)
  6. webug4.0支付漏洞
  7. wordpress最佳架构_2018年21个最佳材料设计WordPress主题
  8. 人工智能全面战胜人类?下一步是取代人类?
  9. App 抓包问题与解决
  10. Linux笔记之浅析Linux文件管理