Guava中TreeRangeMap基本使用
阿新 • • 發佈:2017-07-26
add static attr_ att keyword markdown sys hide fadein
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
(完)
Guava中TreeRangeMap基本使用