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 类