GuavaでのRangeとCutの概要

4271 ワード

GuavaではRangeクラスで区間を表し、Rangeの2つの端点は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 lowerBound;
    final com.google.common.collect.Cut 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区間は完全に2つの区間の最小区間を含むことができて、和を求めることに相当します
Cutは抽象クラスです
abstract class Cut<C extends Comparable> implements Comparable<Cut<C>>, Serializable {
    final C endpoint;
    ...//    
}

内部にはエンドポイントデータが1つしか保存されていません.Cutの内部には4つの内部クラスがあり、インスタンスを取得するには、Cutを継承するいくつかの内部クラス(private static final class)しか返されません.通常のBelowValue、AboveValue、BelowAll、AboveAllをそれぞれ表します.そのうち、後の2つは内部にstatic finalのINSTANCEが1つずつあり、最高(低)を表すために使用されます.いずれにしても最も必要で、1つしか必要ありません.これらのクラスは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