Guava中TreeRangeMap基本使用

RangeMap跟一般的Map一樣,存儲鍵值對,按照鍵來取值。不同於Map的是鍵的類型必須是Range,也既是一個區間。RangeMap在Guava中的定義是一個接口:

public interface RangeMap<K extends Comparable, V> {
    @Nullable  //返回值可能爲空的註解
    V get(K var1);  //按照單點鍵取鍵所屬區間對應的值
    @Nullable  //返回值可能爲空的註解
    Entry<Range<K>, V> getEntry(K var1);  //獲得一條記錄,這裏的Entry是Map.Entry
    void put(Range<K> var1, V var2);  //插入數據
    void remove(Range<K> var1);  //刪除數據
    ...   //其他方法
}

TreeRangeMap是RangeMap的一個實現,保證內部區間不重疊且有序,舉個例子:

public class Test {
    public static void main(String[] args) {
        RangeMap<Integer, String> 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<Range<Integer>, 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

getEntry方法也是一樣的原理,此處不再贅述。

remove方法用來切割TreeRangeMap中的鍵區間
1、如果TreeRangeMap中的某個區間沒有被完全刪除,那麼這個區間只是被切割小,但還是存在於TreeRangeMap中
2、如果TreeRangeMap中的某個區間被完全刪除,那麼這個區間和對應的值都被刪除掉
還是以第二次的輸入爲標註,在後面加上刪除和輸出的試驗代碼:

test.remove(Range.closed(1, 2));
for(Map.Entry<Range<Integer>, 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<Range<Integer>, 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

(完)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章