在Guava中新增了一个新的类型Range,从名字就可以了解到,这个是和区间有关的数据结构。从Google官方文档可以得到定义:Range定义了连续跨度的范围边界,这个连续跨度是一个可以比较的类型(Comparable type)。比如1到100之间的整型数据。

  在数学里面的范围是有边界和无边界之分的;同样,在Guava中也有这个说法。如果这个范围是有边界的,那么这个范围又可以分为包括开集(不包括端点)和闭集(包括端点);如果是无解的可以用+∞表示。如果枚举的话,一共有九种范围表示:

Guava Range 概念,范围和方法
概念 表示范围 guava对应功能方法
(a..b) {x | a < x < b} open(C, C)
[a..b] {x | a <= x <= b}  closed(C, C)
[a..b) {x | a <= x < b} closedOpen(C, C)
(a..b] {x | a < x <= b} openClosed(C, C)
(a..+∞) {x | x > a} greaterThan(C)
[a..+∞) {x | x >= a} atLeast(C)
(-∞..b) {x | x < b} lessThan(C)
(-∞..b] {x | x <= b} atMost(C)
(-∞..+∞) all values all()

  上表中的guava对应功能方法那一栏表示Range类提供的方法,分别来表示九种可能出现的范围区间。如果区间两边都存在范围,在这种情况下,区间右边的数不可能比区间左边的数小。在极端情况下,区间两边的数是相等的,但前提条件是最少有一个边界是闭集的,否则是不成立的。比如:
  [a..a] : 里面只有一个数a;
  [a..a); (a..a] : 空的区间范围,但是是有效的;
  (a..a) : 这种情况是无效的,构造这样的Range将会抛出异常。
  在使用Range时需要注意:在构造区间时,尽量使用不可改变的类型。如果你需要使用可变的类型,在区间类型构造完成的情况下,请不要改变区间两边的数。

  实例:

public class TestBaseRange {
@Test
public void testRange(){
System.out.println("open:"+Range.open(1, 10));
System.out.println("closed:"+ Range.closed(1, 10));
System.out.println("closedOpen:"+ Range.closedOpen(1, 10));
System.out.println("openClosed:"+ Range.openClosed(1, 10));
System.out.println("greaterThan:"+ Range.greaterThan(10));
System.out.println("atLeast:"+ Range.atLeast(10));
System.out.println("lessThan:"+ Range.lessThan(10));
System.out.println("atMost:"+ Range.atMost(10));
System.out.println("all:"+ Range.all());
System.out.println("closed:"+Range.closed(10, 10));
System.out.println("closedOpen:"+Range.closedOpen(10, 10));
//会抛出异常
System.out.println("open:"+Range.open(10, 10));
}
}

  此外,范围可以构造实例通过绑定类型显式,例如:

public class TestBaseRange {

    @Test
public void testRange(){
System.out.println("downTo:"+Range.downTo(4, BoundType.OPEN));
System.out.println("upTo:"+Range.upTo(4, BoundType.CLOSED));
System.out.println("range:"+Range.range(1, BoundType.CLOSED, 4, BoundType.OPEN));
}
}

  输出:

downTo:(4‥+∞)
upTo:(-∞‥4]
range:[1‥4)

  操作方法

  1.contains:判断值是否在当前Range内

    @Test
public void testContains(){
System.out.println(Range.closed(1, 3).contains(2));
System.out.println(Range.closed(1, 3).contains(4));
System.out.println(Range.lessThan(5).contains(5));
System.out.println(Range.closed(1, 4).containsAll(Ints.asList(1, 2, 3)));
}   //=====输出=====
  true
  false
  false
  true

  2.Endpoint相关查询方法:

    @Test
public void testQuery(){
System.out.println("hasLowerBound:"+Range.closedOpen(4, 4).hasLowerBound());
System.out.println("hasUpperBound:"+Range.closedOpen(4, 4).hasUpperBound());
System.out.println(Range.closedOpen(4, 4).isEmpty());
System.out.println(Range.openClosed(4, 4).isEmpty());
System.out.println(Range.closed(4, 4).isEmpty());
// Range.open throws IllegalArgumentException
//System.out.println(Range.open(4, 4).isEmpty()); System.out.println(Range.closed(3, 10).lowerEndpoint());
System.out.println(Range.open(3, 10).lowerEndpoint());
System.out.println(Range.closed(3, 10).upperEndpoint());
System.out.println(Range.open(3, 10).upperEndpoint());
System.out.println(Range.closed(3, 10).lowerBoundType());
System.out.println(Range.open(3, 10).upperBoundType());
}   //======输出=======
  hasLowerBound:true
  hasUpperBound:true
  true
  true
  false
  3
  3
  10
  10
  CLOSED
  OPEN

  3.encloses方法:encloses(Range range)中的range是否包含在需要比较的range中

    @Test
public void testEncloses(){
Range<Integer> rangeBase=Range.open(1, 4);
Range<Integer> rangeClose=Range.closed(2, 3);
Range<Integer> rangeCloseOpen=Range.closedOpen(2, 4);
Range<Integer> rangeCloseOther=Range.closedOpen(2, 5);
System.out.println("rangeBase: "+rangeBase+" Enclose:"+rangeBase.encloses(rangeClose)+" rangeClose:"+rangeClose);
System.out.println("rangeBase: "+rangeBase+" Enclose:"+rangeBase.encloses(rangeCloseOpen)+" rangeClose:"+rangeCloseOpen);
System.out.println("rangeBase: "+rangeBase+" Enclose:"+rangeBase.encloses(rangeCloseOther)+" rangeClose:"+rangeCloseOther);
}   //=======输出========
  rangeBase: (1‥4) Enclose:true rangeClose:[2‥3]
  rangeBase: (1‥4) Enclose:true rangeClose:[2‥4)
  rangeBase: (1‥4) Enclose:false rangeClose:[2‥5)

  4.isConnected:range是否可连接上

    @Test
public void testConnected(){
System.out.println(Range.closed(3, 5).isConnected(Range.open(5, 10)));
System.out.println(Range.closed(0, 9).isConnected(Range.closed(3, 4)));
System.out.println(Range.closed(0, 5).isConnected(Range.closed(3, 9)));
System.out.println(Range.open(3, 5).isConnected(Range.open(5, 10)));
System.out.println(Range.closed(1, 5).isConnected(Range.closed(6, 10)));
}   //======输出=========
  true
  true
  true
  false
  false

  4.intersection:如果两个range相连时,返回最大交集,如果不相连时,直接抛出异常

    @Test
public void testIntersection(){
System.out.println(Range.closed(3, 5).intersection(Range.open(5, 10)));
System.out.println(Range.closed(0, 9).intersection(Range.closed(3, 4)));
System.out.println(Range.closed(0, 5).intersection(Range.closed(3, 9)));
System.out.println(Range.open(3, 5).intersection(Range.open(5, 10)));
System.out.println(Range.closed(1, 5).intersection(Range.closed(6, 10)));
}   //=======输出=========
  (5‥5]
  [3‥4]
  [3‥5]   注意:第四和第五行代码,当集合不相连时,会直接报错

  5.span:获取两个range的并集,如果两个range是两连的,则是其最小range

    @Test
public void testSpan(){
System.out.println(Range.closed(3, 5).span(Range.open(5, 10)));
System.out.println(Range.closed(0, 9).span(Range.closed(3, 4)));
System.out.println(Range.closed(0, 5).span(Range.closed(3, 9)));
System.out.println(Range.open(3, 5).span(Range.open(5, 10)));
System.out.println(Range.closed(1, 5).span(Range.closed(6, 10)));
System.out.println(Range.closed(1, 5).span(Range.closed(7, 10)));
}   //=====输出=======
  true
  true
  true
  false
  false

Guava学习笔记:Range的更多相关文章

  1. Guava学习笔记目录

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

  2. guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁

    guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁 1,本文翻译自 http://eclipsesource.com/blogs/2012/06/06/cleaner-code- ...

  3. guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用

    guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用 1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection ...

  4. Guava学习笔记(一)概览

    Guava是谷歌开源的一套Java开发类库,以简洁的编程风格著称,提供了很多实用的工具类, 在之前的工作中应用过Collections API和Guava提供的Cache,不过对Guava没有一个系统 ...

  5. Guava学习笔记(1):Optional优雅的使用null

    转自:http://www.cnblogs.com/peida/archive/2013/06/14/Guava_Optional.html 参考:[Google Guava] 1.1-使用和避免nu ...

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

    http://www.cnblogs.com/peida/tag/Guava/ Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, cachin ...

  7. Guava学习笔记:Guava新集合-Table等

    Table 当我们需要多个索引的数据结构的时候,通常情况下,我们只能用这种丑陋的Map<FirstName, Map<LastName, Person>>来实现.为此Guava ...

  8. Guava学习笔记:Optional优雅的使用null

    在我们学习和使用Guava的Optional之前,我们需要来了解一下Java中null.因为,只有我们深入的了解了null的相关知识,我们才能更加深入体会领悟到Guava的Optional设计和使用上 ...

  9. Guava学习笔记(4):Ordering犀利的比较器

    转自:http://www.cnblogs.com/peida/p/Guava_Ordering.html Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering ...

随机推荐

  1. iOS开发——网络使用技术OC篇&网络爬虫-使用正则表达式抓取网络数据

    网络爬虫-使用正则表达式抓取网络数据 关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现 1:正则表达 2:利用其他语言的工具包:java/Python 先来看 ...

  2. 使用__slots__限定实例的成员列表

    使用__slots__限定实例的成员列表 默认情况下,python对象队象的每个实例(instance)都会有一个字典来存储该实例的属性,这样做的好处在于运行时期每个对象可以任意设置新的属性.而相对应 ...

  3. KnockoutJS 3.X API 第四章 表单绑定(10) textInput、hasFocus、checked绑定

    textInput绑定目的 textInput绑定主要用于<input>或者<textarea>元素.他提供了DOM和viewmodel的双向更新.不同于value绑定,tex ...

  4. CardLayout布局练习(小的图片浏览器)

    /* 涉及Panel中的图片的加载,还有Frame的关闭的方法, CardLayout(int hgap, int vgap)就会决定卡片面板的大小 匿名类的使用... */ import java. ...

  5. Example of BeanFactoryAware in Spring--转

    原文地址:http://www.concretepage.com/spring/example_beanfactoryaware_spring If a bean in spring implemen ...

  6. JS魔法堂:剖析源码理解Promises/A规范

    一.前言 Promises/A是由CommonJS组织制定的异步模式编程规范,有不少库已根据该规范及后来经改进的Promises/A+规范提供了实现 如Q, Bluebird, when, rsvp. ...

  7. Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解

    一.控制器定义 控制器提供访问应用程序的行为,通常通过服务接口定义或注解定义两种方法实现. 控制器解析用户的请求并将其转换为一个模型.在Spring MVC中一个控制器可以包含多个Action(动作. ...

  8. 数据结构:C_顺序栈的实现

    数据结构顺序栈的实现(C语言版) 1.写在前面 栈是一种遵循元素先进(Push)后出(Pop)规则的线性表,它的实现可以用数组或者链表. ..... 2.代码分解 2.1对栈的结构定义: typede ...

  9. 使用Html5+C#+微信 开发移动端游戏详细教程 :(三)使用html5引擎搭建游戏框架

    教程里的案例我们是通过H5游戏引擎开发,目前H5的游戏引擎比较好用的是白鹭,不过对于新手来说白鹭的开发环境和工具使用过于复杂,这里推荐一个国内大神编写的游戏引擎:lufylegend. 直接在页面引入 ...

  10. [SDK2.2]Windows Azure Cloud Service (35) 使用VS2013发布Azure Cloud Service

    <Windows Azure Platform 系列文章目录> 好久没有更新BLOG了,今天我们继续Windows Azure相关的内容. 笔者最近把Visual Studio升级到了20 ...