Google Guava 快速入门 —— 【新集合】RangeMap 类

Google Guava 快速入门.jpg

Guava RangeMap 类

一、接口声明

以下是 com.google.common.collect.Multiset<E> 接口的声明:

@Beta
@GwtIncompatible
public interface RangeMap<K extends Comparable,V>

实现类:ImmutableRangeMapTreeRangeMap

二、接口方法

官方文档:https://google.github.io/guava/releases/27.0.1-jre/api/docs/com/google/common/collect/RangeMap.html

修饰符和类型方法描述
Map<Range<K>,V>asDescendingMapOfRanges() 
将此范围映射的视图作为不可修改的Map<range,V>返回.
Map<Range<K>,V>asMapOfRanges() 
将此范围映射的视图作为不可修改的Map<range,V>返回.
voidclear() 
从此范围映射中删除所有关联.
booleanequals(@Nullable Object o) 
如果obj是另一个具有等效asMapOfRanges()的RangeMap,则返回true.
Vget(K key) 
返回与指定键关联的值,如果没有此值,则返回null.
@Nullable Map.Entry<Range<K>,V>getEntry(K key) 
如果范围映射中存在此类范围,则返回包含此键及其关联值的范围,否则返回null.
inthashCode() 
返回 asMapOfRanges().hashCode().
voidput(Range<K> range, V value) 
将范围映射到指定值.
voidputAll(RangeMap<K,V> rangeMap) 
将rangeMap中的所有关联放入此范围映射中.
voidputCoalescing(Range<K> range, V value) 
将范围映射到指定值,将此范围与具有与此范围相连的相同值的任何现有范围合并.
voidremove(Range<K> range) 
从指定范围内的此范围映射中删除所有关联.
Range<K>span() 
返回包含此RangeMap中范围的最小范围.
RangeMap<K,V>subRangeMap(Range<K> range) 
返回此范围映射的与范围相交的部分的视图.
StringtoString() 
返回此范围映射的可读字符串表示形式

三、使用

RangeMap 是一种集合类型(collection type),它将不相交、且不为空的 Range(key)映射给一个值(Value)。和 RangeSet不一样,RangeMap 不可以将相邻的区间合并,即使这个区间映射的值是一样的。

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

对 RangeMap 可以添加、删除其中的对象,操作如下:

public void test1(){
    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");
    System.out.println(rangeMap);

    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..6)=bbb, [6..10]=aaa, (10..20)=aaa, [20..20]=aaa]
[[1..3]=aaa, (3..5)=bbb, (11..20)=aaa, [20..20]=aaa]

从结果中可以看出,RangeMap 中的每一个 Range 都对应一个 value。注意观察运行的结果:(10‥20)=aaa, [20‥20]=aaa 是没有被合并的!这是 RangeMap 和 RangeSet 的一个区别。

四遍历

同样,如果我们需要遍历 rangeMap 中的所有元素可以用下面方法实现:

// 方法1
// Map<Range<Integer>, String> rangeStringMap = rangeMap.asDescendingMapOfRanges();  // 倒序
Map<Range<Integer>, String> rangeStringMap = rangeMap.asMapOfRanges();
rangeStringMap.forEach((k, v) -> System.out.println("Key:" + k + ",Value:" + v));

// 方法2
Map<Range<Integer>, String> rangeStringMap = rangeMap.asMapOfRanges();
Set<Map.Entry<Range<Integer>, String>> entries = rangeStringMap.entrySet();
Iterator<Map.Entry<Range<Integer>, String>> iterator = entries.iterator();
while (iterator.hasNext()) {
    Map.Entry<Range<Integer>, String> next = iterator.next();
    System.out.println("Key:" + next.getKey() + ",Value:" + next.getValue());
}

运行结果如下:

Key:[1..3],Value:aaa
Key:(3..5),Value:bbb
Key:(11..20),Value:aaa
Key:[20..20],Value:aaa

rangeStringMap 还提供了 keySet() 方法来的到key的set集,如下:

Set<Range<Integer>> rangeSet = rangeMap.asMapOfRanges().keySet();
rangeSet.forEach(System.out::println);

和 RangeSet 不一样,RangeMap 没有提供 complement()contains()rangeContaining() 以及 encloses() 方法。

五、相关文章



未经允许请勿转载:程序喵 » Google Guava 快速入门 —— 【新集合】RangeMap 类

点  赞 (0) 打  赏
分享到: