欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

guava笔记9-Ranges 博客分类: guava

程序员文章站 2024-03-23 15:29:10
...
很多时候,我们需要表示一个数据范围,可能会这样传参数:

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)