GavaではTreeRangeMapが基本的に使用されています。

7174 ワード

Range Mapは普通のMapと同じように、キーの値を記憶して、キーによって値を取ります。Mapと違ってキーの種類はRangeでなければなりません。区間でもあります。RangeMapのGuavaにおける定義はインターフェースである:
public interface RangeMap<K extends Comparable, V> {
    @Nullable  //          
    V get(K var1);  //               
    @Nullable  //          
    Entry, V> getEntry(K var1);  //      ,   Entry Map.Entry
    void put(Range var1, V var2);  //    
    void remove(Range var1);  //    
    ...   //    
}
TreeRangeMapはRangeMapの実現であり、内部区間が重複しないようにして、秩序化していることを保証する。例を挙げると、
public class Test {
    public static void main(String[] args) {
        RangeMap test = TreeRangeMap.create();
        test.put(Range.closed(1, 2), "xyb");
        test.put(Range.closed(10, 12), "Charlotte");
        test.put(Range.closed(5, 8), "love");
        for(Map.Entry, String> entry : test.asMapOfRanges().entrySet()) {
            System.out.println(entry.getKey()+"\t"+entry.getValue());
        }
    }
}
出力結果は:
[1‥2]   xyb
[5‥8]   love
[10‥12] Charlotte
TreeRangeMapが挿入する区間とTreeRangeMapが保存している区間とが重複している場合、TreeRangeMapは以前の区間を切断し、現在の挿入区間の完全性を保持し、例えば先ほどの例の挿入区間を置き換える。
test.put(Range.closed(1, 7), "xyb");
test.put(Range.closed(6, 12), "Charlotte");
test.put(Range.closed(5, 8), "love");
出力は:
[1‥5)   xyb
[5‥8]   love
(8‥12]  Charlotte
TreeRangeMapは区間をキーとしているが、get法は単一値Kをパラメータとしている。この場合、TreeRangeMapは先にK対応区間を検索して、この区間に対応する値を返します。上のコードを例にして、中に検索を入れます。
test.put(Range.closed(1, 7), "xyb");
test.put(Range.closed(6, 12), "Charlotte");
test.put(Range.closed(5, 8), "love");
System.out.println(test.get(2));
この時の出力は:
xyb
get Entry方法も同じ原理です。ここではもう説明しません。
remove方法でTreeRangeMapのキー区間1をカットします。Tree RangeMapの中のある区間が完全に削除されていない場合、この区間はカットされただけです。しかし、TreeRangeMapの中にあります。Tree RangeMapの中のある区間が完全に削除されたら、この区間と対応する値は全部削除されますか?それとも2回目の入力で表示されますか?削除と出力の試験コードを後に付けます。
test.remove(Range.closed(1, 2));
for(Map.Entry, String> entry : test.asMapOfRanges().entrySet()) {
    System.out.println(entry.getKey()+"\t"+entry.getValue());
}
System.out.println("-------------------");
test.remove(Range.closedOpen(1, 5));
for(Map.Entry, String> entry : test.asMapOfRanges().entrySet()) {
    System.out.println(entry.getKey()+"\t"+entry.getValue());
}
出力:
(2‥5)   xyb
[5‥8]   love
(8‥12]  Charlotte
-------------------
[5‥8]   love
(8‥12]  Charlotte
(終わり)