inScope(int min, int max, boolean minInclude, boolean maxInclude)
这样的代码看起来很繁琐。
Guava提供了一种数据结构叫做Range,正好用于表达这样一种数据。
Range提供了一些静态工厂方法,用于构造各种是否包含边界的范围:
| Notation | Definition | Factory method |
| (a..b) | {x | a < x < b} | |
| [a..b] | {x | a <= x <= b} | |
| (a..b] | {x | a < x <= b} | |
| [a..b) | {x | a <= x < b} | |
| (a..+∞) | {x | x > a} | |
| [a..+∞) | {x | x >= a} | |
| (-∞..b) | {x | x < b} | |
| (-∞..b] | {x | x <= b} | |
| {x} |
如: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)
本文介绍了Guava库中Range数据结构的使用方法,包括如何创建不同类型的区间、如何指定边界条件,以及提供了多种用于区间操作的方法,如判断是否包含元素、区间相交等。

被折叠的 条评论
为什么被折叠?



