Guava之RangeMap学习小结

简介

RangeMap是一种集合类型( collection type),它将不相交、且不为空的Range(key)映射给一个值(Value)。RangeMap跟一般的Map一样,存储键值对,按照键来取值。不同于Map的是键的类型必须是Range,也既是一个区间。

和RangeSet一样,实现RangeMap也是一个接口,实现它的也只有两个类,分别为mmutableRangeMap和TreeRangeMap。用的多的还是TreeRangeMap,下面主要以TreeRangeMap来说明RangeMap。

基础用法

添加/删除

    public static void main(String[] args) {
        RangeMap<Integer, String> rangeMap = TreeRangeMap.create();
        rangeMap.put(Range.closed(1, 10), "aaa");
        System.out.println(rangeMap);
        rangeMap.put(Range.open(3, 6), "bbb");
        System.out.println(rangeMap);
        rangeMap.put(Range.openClosed(10, 20), "aaa");
        System.out.println(rangeMap);
        rangeMap.put(Range.closed(20, 20), "aaa");
        rangeMap.remove(Range.closed(5, 11));
        System.out.println(rangeMap);
    }

结果:

[[1‥10]=aaa]

[[1‥3]=aaa, (3‥6)=bbb, [6‥10]=aaa]

[[1‥3]=aaa, (3‥6)=bbb, [6‥10]=aaa, (10‥20]=aaa]

[[1‥3]=aaa, (3‥5)=bbb, (11‥20)=aaa, [20‥20]=aaa] 

note:

1.如果TreeRangeMap要插入的区间与TreeRangeMap已保存的区间发生重叠,那么TreeRangeMap会对之前的区间切割,保留当前插入区间的完整性。

2.和RangeSet不一样,RangeMap不可以将相邻的区间合并,即使这个区间映射的值是一样的。

3.其中TreeRangeMap是key有序的。

遍历

asMapOfRanges()方法得到RangeMap的Map<Range, V>视图,我们可以利用它来遍历RangeMap。

使用map的entrySet

Map rangeStringMap = rangeMap.asMapOfRanges();
        Set<Map.Entry<Range, String>> entries = rangeStringMap.entrySet();
        Iterator<Map.Entry<Range, String>> iterator = entries.iterator();
        while(iterator.hasNext()){
            Map.Entry<Range, String> next = iterator.next();
            System.out.println(next.getKey() + "\t" + next.getValue());
        }

 

结果

[1‥3]	aaa
(3‥5)	bbb
(11‥20)	aaa
[20‥20]	aaa

 

使用map的keySet

Set<Range> ranges = rangeStringMap.keySet();
        Iterator<Range> iterator1 = ranges.iterator();
        while(iterator1.hasNext()){
            Range next = iterator1.next();
            System.out.println(next + "\t" + rangeStringMap.get(next));
        }

 

结果同上。

note:

推荐使用第一种遍历的方法。因为第二种遍历rangeStringMap时rangeStringMap.get(next),多访问了一次rangeStringMap,效率比较慢。

猜你喜欢

转载自welcomezhang.iteye.com/blog/2368513
今日推荐