Class BoundedRange<T extends Comparable<? super T>>

java.lang.Object
org.miaixz.bus.core.lang.range.BoundedRange<T>
Type Parameters:
T - 边界值类型
All Implemented Interfaces:
Predicate<T>

public class BoundedRange<T extends Comparable<? super T>> extends Object implements Predicate<T>

参考GuavaRange实现,用于描述作为上下界的两个Bound实例围成的一段区间。 作为Predicate使用时,可检验指定值是否在区间中,即指定值是否同时满足上下界的Bound.test(T)方法。

区间的类型,支持通过工厂方法创建下述几种类型的区间:

区间
区间 数学定义 工厂方法
(a, b) {x | a < x < b} open(T, T)
[a, b] {x | a <= x <= b} close(T, T)
(a, b] {x | a < x <= b} openClose(T, T)
[a, b) {x | a <= x < b} closeOpen(T, T)
(a, +∞) {x | x > a} greaterThan(T)
[a, +∞) {x | x >= a} atLeast(T)
(-∞, b) {x | x < b} lessThan(T)
(-∞, b] {x | x <= b} atMost(T)
(-∞, +∞) {x} all()

空区间

根据数学定义,当区间中无任何实数时,认为该区间 代表的集合为空集, 用户可通过isEmpty()确认当前实例是否为空区间。 若实例上界a,下界为b,则当实例满足下述任意条件时,认为其为一个空区间:

  • a > b
  • [a, b),且a == b
  • (a, b),且a == b
  • (a, b],且a == b
当通过工厂方法创建区间时,若区间为空,则会抛出IllegalArgumentException, 但是通过交并操作仍有可能创建出满足上述描述的空区间。 此时若空区间参与操作可能得到意外的结果, 因此对通过非工厂方法得到的区间,在操作前有必要通过isEmpty()进行检验。
Since:
Java 17+
Author:
Kimi Liu
See Also:
  • Method Details

    • all

      public static <T extends Comparable<? super T>> BoundedRange<T> all()
      构建一个上下界皆无限大的区间,即{x | -∞ < x < +∞}
      Type Parameters:
      T - 比较对象类型
      Returns:
      区间
    • close

      public static <T extends Comparable<? super T>> BoundedRange<T> close(T lowerBound, T upperBound)
      构建一个闭区间,即{x | lowerBound <= x <= upperBound}
      Type Parameters:
      T - 边界值类型
      Parameters:
      lowerBound - 下界,不能为空
      upperBound - 上界,不能为空
      Returns:
      区间
      Throws:
      IllegalArgumentException - 当创建的区间表示的集合为空时抛出
      NullPointerException - 上界或下界为null时抛出
    • open

      public static <T extends Comparable<? super T>> BoundedRange<T> open(T lowerBound, T upperBound)
      构建一个开区间,即{x | lowerBound < x < upperBound}
      Type Parameters:
      T - 边界值类型
      Parameters:
      lowerBound - 下界,不能为空
      upperBound - 上界,不能为空
      Returns:
      区间
      Throws:
      IllegalArgumentException - 当创建的区间表示的集合为空时抛出
      NullPointerException - 上界或下界为null时抛出
    • closeOpen

      public static <T extends Comparable<? super T>> BoundedRange<T> closeOpen(T lowerBound, T upperBound)
      构建一个左闭右开区间,即{x | lowerBound <= x < upperBound}
      Type Parameters:
      T - 边界值类型
      Parameters:
      lowerBound - 下界,不能为空
      upperBound - 上界,不能为空
      Returns:
      区间
      Throws:
      IllegalArgumentException - 当创建的区间表示的集合为空时抛出
      NullPointerException - 上界或下界为null时抛出
    • openClose

      public static <T extends Comparable<? super T>> BoundedRange<T> openClose(T lowerBound, T upperBound)
      构建一个左闭右开区间,即{x | lowerBound < x <= upperBound}
      Type Parameters:
      T - 边界值类型
      Parameters:
      lowerBound - 下界,不能为空
      upperBound - 上界,不能为空
      Returns:
      区间
      Throws:
      IllegalArgumentException - 当创建的区间表示的集合为空时抛出
      NullPointerException - 上界或下界为null时抛出
    • greaterThan

      public static <T extends Comparable<? super T>> BoundedRange<T> greaterThan(T lowerBound)
      {x | lowerBound < x < +∞}
      Type Parameters:
      T - 边界值类型
      Parameters:
      lowerBound - 下界,不能为空
      Returns:
      区间
      Throws:
      NullPointerException - 下界为null时抛出
      See Also:
    • atLeast

      public static <T extends Comparable<? super T>> BoundedRange<T> atLeast(T lowerBound)
      {x | lowerBound < x < +∞}
      Type Parameters:
      T - 边界值类型
      Parameters:
      lowerBound - 下界,不能为空
      Returns:
      区间
      Throws:
      NullPointerException - 下界为null时抛出
      See Also:
    • lessThan

      public static <T extends Comparable<? super T>> BoundedRange<T> lessThan(T upperBound)
      {x | -∞ < x < upperBound}
      Type Parameters:
      T - 边界值类型
      Parameters:
      upperBound - 上界,不能为空
      Returns:
      区间
      Throws:
      NullPointerException - 上界为null时抛出
      See Also:
    • atMost

      public static <T extends Comparable<? super T>> BoundedRange<T> atMost(T upperBound)
      {x | -∞ < x <= max}
      Type Parameters:
      T - 边界值类型
      Parameters:
      upperBound - 上界,不能为空
      Returns:
      区间
      Throws:
      NullPointerException - 上界为null时抛出
      See Also:
    • getLowerBound

      public Bound<T> getLowerBound()
      获取下界
      Returns:
      下界
    • getLowerBoundValue

      public T getLowerBoundValue()
      获取下界值
      Returns:
      下界值
    • hasLowerBound

      public boolean hasLowerBound()
      是否有下界
      Returns:
      是否
    • getUpperBound

      public Bound<T> getUpperBound()
      获取上界
      Returns:
      上界
    • getUpperBoundValue

      public T getUpperBoundValue()
      获取上界值
      Returns:
      上界值
    • hasUpperBound

      public boolean hasUpperBound()
      是否有上界
      Returns:
      是否
    • isEmpty

      public boolean isEmpty()

      当前区间是否为空。 当由下界left与上界right构成的区间, 符合下述任意条件时,认为当前区间为空:

      • 对任何区间,有left > right
      • 对半开半闭区间[left, right),有left == right
      • 对开区间(left, right),有left == right
      • 对半开半闭区间(left, right],有left == right
      Returns:
      是否
    • toString

      public String toString()
      输出当前区间的字符串,格式为"[a, b]"
      Overrides:
      toString in class Object
      Returns:
      字符串
    • equals

      public boolean equals(Object o)
      比较两个实例是否相等
      Overrides:
      equals in class Object
      Parameters:
      o - 另一实例
      Returns:
      是否
    • hashCode

      public int hashCode()
      获取实例哈希值
      Overrides:
      hashCode in class Object
      Returns:
      哈希值
    • isSuperset

      public boolean isSuperset(BoundedRange<T> other)
      other是否是当前区间的子集
      Parameters:
      other - 另一个区间
      Returns:
      是否
    • isProperSuperset

      public boolean isProperSuperset(BoundedRange<T> other)
      other是否是当前区间的子集
      Parameters:
      other - 另一个区间
      Returns:
      是否
    • isSubset

      public boolean isSubset(BoundedRange<T> other)
      当前区间是否是other的子集
      Parameters:
      other - 另一个区间
      Returns:
      是否
    • isProperSubset

      public boolean isProperSubset(BoundedRange<T> other)
      当前区间是否是other的真子集
      Parameters:
      other - 另一个区间
      Returns:
      是否
    • isDisjoint

      public boolean isDisjoint(BoundedRange<T> other)
      other是否与当前区间不相交
      Parameters:
      other - 另一个区间
      Returns:
      是否
    • isIntersected

      public boolean isIntersected(BoundedRange<T> other)
      other是否与当前区间相交:
      Parameters:
      other - 另一个区间
      Returns:
      是否
    • test

      public boolean test(T value)
      指定值是否在当前区间内
      Specified by:
      test in interface Predicate<T extends Comparable<? super T>>
      Parameters:
      value - 要检测的值
      Returns:
      是否
    • unionIfIntersected

      public BoundedRange<T> unionIfIntersected(BoundedRange<T> other)
      other与当前区间相交,则将其与当前区间合并。
      Parameters:
      other - 另一个区间
      Returns:
      合并后的新区间,若两区间不相交则返回当前集合
    • span

      public BoundedRange<T> span(BoundedRange<T> other)
      获得包含当前区间与指定区间的最小的区间
      Parameters:
      other - 另一个区间
      Returns:
      包含当前区间与指定区间的最小的区间
    • gap

      public BoundedRange<T> gap(BoundedRange<T> other)
      other与当前区间不相连,则获得两区间中间的间隔部分
      Parameters:
      other - 另一个区间
      Returns:
      代表间隔部分的区间,若两区间相交则返回null
    • intersection

      public BoundedRange<T> intersection(BoundedRange<T> other)
      other与当前区间相交,则获得该区间与当前区间的交集
      Parameters:
      other - 另一个区间
      Returns:
      代表交集的区间,若无交集则返回null
    • subGreatThan

      public BoundedRange<T> subGreatThan(T min)
      截取当前区间中大于min的部分,若min不在该区间中,则返回当前区间本身
      Parameters:
      min - 最大的左值
      Returns:
      区间
    • subAtLeast

      public BoundedRange<T> subAtLeast(T min)
      截取当前区间中大于等于min的部分,若min不在该区间中,则返回当前区间本身
      Parameters:
      min - 最大的左值
      Returns:
      区间
    • subLessThan

      public BoundedRange<T> subLessThan(T max)
      截取当前区间中小于max的部分,若max不在该区间中,则返回当前区间本身
      Parameters:
      max - 最大的左值
      Returns:
      区间
    • subAtMost

      public BoundedRange<T> subAtMost(T max)
      截取当前区间中小于等于max的部分,若max不在该区间中,则返回当前区间本身
      Parameters:
      max - 最大的左值
      Returns:
      区间