区间结构 -- Range

2017-11-22 16:52:18   最后更新: 2017-11-22 16:52:18   访问数量:55




jdk 为我们提供了各式各样的容器,用来解决不同场景下的集合问题,但很多时候,我们需要维护的集合是连续跨度的范围,甚至是多段范围跨度的交集、并集,jdk 的容器就很难去支持了

Guava 提供了 Range 类型,用来定义连续跨度的范围边界,并且这个连续跨度是一个可以比较的类型

在此基础上,Guava 还提供了 RangeSet、RangeMap 实现多段范围边界集合的维护,在例如营业时间、允许的范围区间等问题的处理上,提供了前所未有的方便性

一个 Range 对象定义了一段区间,对于一个区间,数学上有开区间和闭区间的区分,Range 的创建方法同样提供了对应的构造方式:

 

Range 对象创建方法
区间创建方法
(a..b)open(C, C)
[a..b]closed(C, C)
[a..b)closedOpen(C, C)
(a..b]openClosed(C, C)
(a..+∞)greaterThan(C)
[a..+∞)atLeast(C)
(-∞..b)lessThan(C)
(-∞..b]atMost(C)
(-∞..+∞)all()

 

  • 示例:
Range.closed("left", "right"); //字典序在"left"和"right"之间的字符串,闭区间 Range.lessThan(4.0); //严格小于4.0的double值

 

 

另一种创建方式是显式指定边界的开闭:

Range 对象创建方法
区间创建方法
有界区间range(C, BoundType, C, BoundType)
无上界区间:((a..+∞) 或[a..+∞))downTo(C, BoundType)
无下界区间:((-∞..b) 或(-∞..b])upTo(C, BoundType)

 

  • 示例:
Range.downTo(4, boundType);// (a..+∞)或[a..+∞),取决于boundType Range.range(1, CLOSED, 4, OPEN);// [1..4),等同于Range.closedOpen(1, 4)

 

 

存在关系

  • contains(C):判断指定的值是否在区间中
  • containsAll(Iterable<? extends C> iterator):判断指定的 Range 区间是否被完全包含在该区间内

 

边界查询

Range 提供了一下方法来查询区间边界的情况:

  • hasLowerBound()和hasUpperBound():判断区间是否有特定边界,或是无限的
  • lowerBoundType()和upperBoundType():返回区间边界类型,CLOSED或OPEN;如果区间没有对应的边界,抛出IllegalStateException
  • lowerEndpoint()和upperEndpoint():返回区间的端点值;如果区间没有对应的边界,抛出IllegalStateException isEmpty():判断是否为空区间

 

包含关系

如果内区间的边界没有超出外区间的边界,则外区间包含内区间。包含判断的结果完全取决于区间端点的比较

  • boolean encloses(Range<C> other)

 

包含关系和存在关系的区别是什么呢?是否只要 containsAll 就一定 encloses 呢?并不是这样的,containsAll 是元素的遍历和比较,而 encloses 关注的则是整个集合

例如[4..5]不包含(3..6),[3..6]不 包含(1..1],虽然他们的前者集合都包含后者集合中的所有元素

 

相连关系

相连关系测试是否有区间同时包含于这两个区间,这等同于数学上的定义”两个区间的并集是连续集合的形式”(空区间的特殊情况除外)

  • boolean isConnected(Range<C> other)

 

交集

Range.intersection(Range) 方法返回两个区间的交集,当且仅当两个区间是相连的,它们才有交集。如果两个区间没有交集,该方法将抛出 IllegalArgumentException

  • Range<C> intersection(Range<C> connectedRange)

 

跨区间

Range.span(Range) 方法返回”同时包括两个区间的最小区间”,如果两个区间相连,那就是它们的并集

  • Range<C> span(Range<C> other)

 






java      range      集合      guava      区间     


1#最爱你的人: (回复)2017-11-23 11:26:45

写的不错

京ICP备15018585号