Guava中用Range类表示区间,Range中的两个端点是Cut类实例,形如:
public final class Range <C extends java.lang.Comparable> implements com.google.common.base.Predicate<C>, java.io.Serializable {
...//其他数据
final com.google.common.collect.Cut<C> lowerBound;
final com.google.common.collect.Cut<C> upperBound;
...//其他方法
}
对于Range来说,对应数学上几种类型的区间:
数学形式 | Range对应的创建函数 |
---|---|
(a..b) | Range.open(C, C) |
[a..b] | Range.closed(C, C) |
[a..b) | Range.closedOpen(C, C) |
(a..b] | Range.openClosed(C, C) |
(a..+∞) | Range.greaterThan(C) |
[a..+∞) | Range. atLeast(C) |
(-∞..b) | Range.lessThan(C) |
(-∞..b] | Range.atMost(C) |
(-∞..+∞) | Range.all() |
需要注意的是,Range的构造函数为private,除了用以上方式创建,还可以显示指定两端的包含情况,使用:
区间描述 | Range对应的创建函数 |
---|---|
显示确定两端是否包含 | range(C, BoundType, C, BoundType) |
从端点到正无穷 ((a..+∞) or [a..+∞)) | downTo(C, BoundType) |
从端点到负无穷 ((-∞..b) or (-∞..b]) | upTo(C, BoundType) |
BoundType是枚举类型,定义了OPEN和CLOSED,代码如下:
public enum BoundType {
OPEN {
BoundType flip() {
return CLOSED;
}
},
CLOSED {
BoundType flip() {
return OPEN;
}
};
private BoundType() {
}
static BoundType forBoolean(boolean inclusive) {
return inclusive?CLOSED:OPEN;
}
abstract BoundType flip();
}
Range实例可以通过lowerBoundType()和upperBoundType()方法获得两端的BoundType。
Range类中比较有用的几个方法
方法签名 | 方法描述 |
---|---|
public boolean encloses(Range other) | 判断是否完全包含other区间 |
public boolean isConnected(Range other) | 判断是否和other区间是否连接,边界点一开一闭也算连接 |
public Range intersection(Range other) | 求和other之间的最小的区间,相当于求交 |
public Range span(Range other) | 求和other区间能完全包含两区间的最小区间,相当于求并 |
Cut是一个抽象类
abstract class Cut<C extends Comparable> implements Comparable<Cut<C>>, Serializable {
final C endpoint;
...//其他东西
}
内部只保存一个端点数据。在Cut内部有四个内部类,要拿到实例只能返回几个继承Cut的内部类(private static final class),分别表示普通的 BelowValue,AboveValue,BelowAll,AboveAll,其中后两个在内部还各有一个 static final 的 INSTANCE,用来表示最高(低),反正是最,只需要一个。这些类实现 Cut 的虚函数。
参考链接:
[1]http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Range.html
[2]https://code.google.com/p/guava-libraries/wiki/RangesExplained
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-08 17:07:53