Guava学习笔记:Range
在Guava中新增了一个新的类型Range,从名字就可以了解到,这个是和区间有关的数据结构。从Google官方文档可以得到定义:Range定义了连续跨度的范围边界,这个连续跨度是一个可以比较的类型(Comparable type)。比如1到100之间的整型数据。
在数学里面的范围是有边界和无边界之分的;同样,在Guava中也有这个说法。如果这个范围是有边界的,那么这个范围又可以分为包括开集(不包括端点)和闭集(包括端点);如果是无解的可以用+∞表示。如果枚举的话,一共有九种范围表示:
| 概念 | 表示范围 | 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的更多相关文章
- Guava学习笔记目录
		Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libra ... 
- guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁
		guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁 1,本文翻译自 http://eclipsesource.com/blogs/2012/06/06/cleaner-code- ... 
- guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用
		guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用 1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection ... 
- Guava学习笔记(一)概览
		Guava是谷歌开源的一套Java开发类库,以简洁的编程风格著称,提供了很多实用的工具类, 在之前的工作中应用过Collections API和Guava提供的Cache,不过对Guava没有一个系统 ... 
- Guava学习笔记(1):Optional优雅的使用null
		转自:http://www.cnblogs.com/peida/archive/2013/06/14/Guava_Optional.html 参考:[Google Guava] 1.1-使用和避免nu ... 
- Guava学习笔记:Google Guava 类库简介
		http://www.cnblogs.com/peida/tag/Guava/ Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, cachin ... 
- Guava学习笔记:Guava新集合-Table等
		Table 当我们需要多个索引的数据结构的时候,通常情况下,我们只能用这种丑陋的Map<FirstName, Map<LastName, Person>>来实现.为此Guava ... 
- Guava学习笔记:Optional优雅的使用null
		在我们学习和使用Guava的Optional之前,我们需要来了解一下Java中null.因为,只有我们深入的了解了null的相关知识,我们才能更加深入体会领悟到Guava的Optional设计和使用上 ... 
- Guava学习笔记(4):Ordering犀利的比较器
		转自:http://www.cnblogs.com/peida/p/Guava_Ordering.html Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering ... 
随机推荐
- 获取当前请求的URL的地址、参数、参数值、各种属性
			//URL: http://localhost:1897/User/Press/UserContent.aspx/9878?id=1#toc Request.ApplicationPath; //结果 ... 
- SQL SERVER 查询性能优化——分析事务与锁(五)
			SQL SERVER 查询性能优化——分析事务与锁(一) SQL SERVER 查询性能优化——分析事务与锁(二) SQL SERVER 查询性能优化——分析事务与锁(三) 上接SQL SERVER ... 
- DOM_01之树及遍历
			1.DOM:ECMAScript+DOM+BOM,Document Object Model,核心DOM+HTML DOM+XML DOM: 2.辨析:①HTML:专门编写网页内容的语言:②XHTML ... 
- windows phone 存储图片 数据库写法
			byte[] _DiseaseImage; [Column(DbType = "Image", UpdateCheck = UpdateCheck.Never)] //保证图像超出 ... 
- Myeclipse 操作数据库
			步骤1:通过MyEclipse中的window->show View->other 调出.DB浏览器,和 SQL Results 步骤2. 可以右键单击空白处,选择new,创建一个新的DB ... 
- PHP获取图片宽度高度、大小尺寸、图片类型、用于布局的img属性
			//php自带函数 getimagesize()$img_info = getimagesize('tomener.jpg'); echo '<pre>'; print_r($img_in ... 
- 轻松搭建Unity3D 安卓Android开发环境
			1,下载安装Java的JDK: http://www.oracle.com/technetwork/java/javase/downloads/index.html (JDK中,包含JRE) 如果是6 ... 
- LeetCode:Move Zeroes
			LeetCode:Move Zeroes [问题再现] Given an array nums, write a function to move all 0's to the end of it w ... 
- 常用mysql数据库引擎——MyISAM和InnoDB区别
			背景: 昨天做项目时,发现使用事务后回滚不了,后来把数据库引擎从MyISAM换成InnoDB后果断好了,如下图: 正文: MyISAM和InnoDB是mysql常用的数据库引擎,他们的区别如下: 数据 ... 
- TCP/IP之四书五经[转自2003.12程序员]
			TCP/IP协议是当前广域网和局域网通用的网络协议,因此,基于TCP/IP的编程就格外重要.从应用上来说,现在直接利用C层次Socket API进行TCP/IP编程的人确实越来越少了,各种现成的框架( ... 
