Guava中Range和Cut简介

来源:互联网 发布:工程预算软件有哪些 编辑:程序博客网 时间:2024/05/29 18:25

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

0 0
原创粉丝点击