博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Guava API学习之RangeSet
阅读量:4150 次
发布时间:2019-05-25

本文共 2243 字,大约阅读时间需要 7 分钟。

 

       前面谈到了中新引入的Range类,也了解了其中的作用,那么今天来谈谈中用到Range来的地方:类。类是用来存储一些不为空的也不相交的范围的数据结构。假如需要向的对象中加入一个新的范围,那么任何相交的部分都会被合并起来,所有的空范围都会被忽略。

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

 

public static void main(String[] args) {		RangeSet rangeSet = TreeRangeSet.create();		rangeSet.add(Range.open(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], [11‥15), (15‥20)]

 

 

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

 

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

 

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

 运行结果:

 

 

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

 如果我们需要得到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的互补。

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

 

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

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

 

 

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

 如果想知道某个范围是否包含在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中任何范围包含.

 

转载地址:http://qplti.baihongyu.com/

你可能感兴趣的文章
二叉树的定义
查看>>
__FILE__,__LINE__
查看>>
redis cluster
查看>>
auto_ptr和shared_ptr
查看>>
Windows8.1 64bit环境下搭建深度学习平台之CUDA安装与配置
查看>>
CUDA在Windows下的软件开发环境搭建
查看>>
高性能网络编程技术
查看>>
Convolutional Neural Networks卷积神经网络
查看>>
深度神经网络DNN的多GPU数据并行框架 及其在语音识别的应用
查看>>
如何调试bash脚本
查看>>
读写二进制文件
查看>>
make 调试和传参
查看>>
yarn
查看>>
gpu合并访问和取模对速度的影响
查看>>
zookeeper
查看>>
java.util.concurrent.Exchanger应用范例与原理浅析
查看>>
ssh能够连接而sftp不能连接的解决方法
查看>>
分布式队列
查看>>
open && pwrite
查看>>
linux读写二进制大文件
查看>>