guava笔记9-Ranges

本文介绍了Guava库中Range数据结构的使用方法,包括如何创建不同类型的区间、如何指定边界条件,以及提供了多种用于区间操作的方法,如判断是否包含元素、区间相交等。
很多时候,我们需要表示一个数据范围,可能会这样传参数:

inScope(int min, int max, boolean minInclude, boolean maxInclude)

这样的代码看起来很繁琐。

Guava提供了一种数据结构叫做Range,正好用于表达这样一种数据。

 

Range提供了一些静态工厂方法,用于构造各种是否包含边界的范围:

Notation

Definition

Factory method

(a..b)

{x | a < x < b}

open

[a..b]

{x | a <= x <= b}

closed

(a..b]

{x | a < x <= b}

openClosed

[a..b)

{x | a <= x < b}

closedOpen

(a..+∞)

{x | x > a}

greaterThan

[a..+∞)

{x | x >= a}

atLeast

(-∞..b)

{x | x < b}

lessThan

(-∞..b]

{x | x <= b}

atMost

(-∞..+∞)

{x}

all

 
如:Range.openClosed(4,6) 就表示(4,6]这样的范围,其实包含数据5,6。

range的参数支持范型,这样任何实现Comparable的对象都能用于Range。

此外,Range也能通过参数指定是否包含边界:
range(C, BoundType, C, BoundType) : 如range(4, BoundType.CLOSE,6, BoundType.OPEN) 表示[4,6)
downTo(C, BoundType) 表示(a..+∞) or [a..+∞)
upTo(C, BoundType) 表示(-∞..b) or (-∞..b]

得到Range对象后,Range提供了一些方法来使用Range对象:
contains(c):判断是否包含数据c
containsAll(list):判断是否包含集合所有数据
hasLowerBound() and hasUpperBound(): 判断是否包含下边界及上边界
lowerBoundType() and upperBoundType() :返回边界包含类型(OPEN or CLOSED),如果没有边界将抛IllegalStateException
lowerEndpoint() and upperEndpoint() :返回边界值,如果没有边界将抛IllegalStateException
isEmpty() :是否是空范围,如(4,4]

集合处理:
Encloses:是否包含,如:[3..6] encloses [4..5],[4..5] does not enclose (3..6)
isConnected:两个范围是否是相邻的,如:[3,5]与(5,10)相邻,(0,9)与(5,10)相邻,(3,5)与(5,10)不相邻
Intersection:返回2个范围的交集。如果两个范围不相邻,抛IllegalArgumentException。
如:(3,5]与[5,10]的交集是[5,5];(0,9)和(3,4)的交集是(3,4)
Span: 返回包含2个范围的最小范围,如:(1, 5)和(6, 10)的span是(1,10)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值