Guava RangeMap 类
一、接口声明
以下是 com.google.common.collect.Multiset<E> 接口的声明:
@Beta @GwtIncompatible public interface RangeMap<K extends Comparable,V>
实现类:ImmutableRangeMap, TreeRangeMap
二、接口方法
官方文档: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 |
Map<Range<K>,V> | asMapOfRanges() 将此范围映射的视图作为不可修改的Map<range |
void | clear() 从此范围映射中删除所有关联. |
boolean | equals(@Nullable Object o) 如果obj是另一个具有等效asMapOfRanges()的RangeMap,则返回true. |
V | get(K key) 返回与指定键关联的值,如果没有此值,则返回null. |
@Nullable Map.Entry<Range<K>,V> | getEntry(K key) 如果范围映射中存在此类范围,则返回包含此键及其关联值的范围,否则返回null. |
int | hashCode() 返回 asMapOfRanges().hashCode(). |
void | put(Range<K> range, V value) 将范围映射到指定值. |
void | putAll(RangeMap<K,V> rangeMap) 将rangeMap中的所有关联放入此范围映射中. |
void | putCoalescing(Range<K> range, V value) 将范围映射到指定值,将此范围与具有与此范围相连的相同值的任何现有范围合并. |
void | remove(Range<K> range) 从指定范围内的此范围映射中删除所有关联. |
Range<K> | span() 返回包含此RangeMap中范围的最小范围. |
RangeMap<K,V> | subRangeMap(Range<K> range) 返回此范围映射的与范围相交的部分的视图. |
String | toString() 返回此范围映射的可读字符串表示形式 |
三、使用
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 类
程序喵