前面谈到了Guava中新引入的Range类,也了解了其中的作用,那么今天来谈谈Guava中用到Range来的地方:RangeSet类。RangeSet类是用来存储一些不为空的也不相交的范围的数据结构。假如需要向RangeSet的对象中加入一个新的范围,那么任何相交的部分都会被合并起来,所有的空范围都会被忽略。
讲了这么多,我们该怎么样利用RangeSet?RangeSet类是一个接口,需要用它的子类来声明一个RangeSet型的对象,实现了 RangeSet接口的类有ImmutableRangeSet和TreeRangeSet,ImmutableRangeSet是一个不可修改的 RangeSet,而TreeRangeSet是利用树的形式来实现。下面主要谈TreeRangeSet的用法:
public static void main(String[] args) { RangeSet rangeSet = TreeRangeSet.create(); rangeSet.add(Range.open(1, 10)); System.out.println(rangeSet); rangeSet.add(Range.closedOpen(11, 15)); System.out.println(rangeSet); rangeSet.add(Range.open(15, 20)); System.out.println(rangeSet); rangeSet.add(Range.openClosed(0, 0)); System.out.println(rangeSet); rangeSet.remove(Range.open(5, 10)); System.out.println(rangeSet); }
运行结果:
[(1‥10)] [(1‥10), [11‥15)] [(1‥10), [11‥15), (15‥20)] [(1‥10), [11‥15), (15‥20)] [(1‥5], [11‥15), (15‥20)]
注意:RangeSet需要充分利用JDK 1.6中NavigableMap特性,所以JDK1.6以下版本无法使用
那如果我们需要遍历rangeSet中的所有元素可以用下面方法实现:
public void iteratorRangeSet(RangeSet integerRangeSet) { if(integerRangeSet == null){ return; } Set<Range> ranges = integerRangeSet.asRanges(); Iterator<Range> iterator = ranges.iterator(); while(iterator.hasNext()){ Range next = iterator.next(); System.out.println(next); } }
运行结果:
(1‥5] [11‥15) (15‥20)
如果我们需要得到rangeSet互补的范围,我们可以用RangeSet提供的 complement()方法,rangeSet.complement()同样是一个RangeSet,其中的元素也是互不相交、且不为空的 RangeSet,那么rangeSet的互补集可以像下面这样来写:
RangeSet complement = rangeSet.complement(); System.out.println(complement);
运行结果
{(-∞‥1)(5‥10)(10‥11)[15‥15][20‥+∞)}
正好是rangeSet的互补。
如果需要在rangeSet中查询某个元素是否在rangeSet中,可以用contains(C)来实现,其中C extends java.lang.Comparable。比如我想得到上述rangeSet是否包含15,可以这样写:
boolean isIn = rangeSet.contains(15); System.out.println(isIn);//false,因为上述范围不包含元素15.
如果想知道某个元素是在rangeSet中哪个范围里面,可以这样写:
Range integerRange = rangeSet.rangeContaining(17); System.out.println(integerRange); //输出(15‥20),因为17被包含在(15‥20)中,所以输出这个范围。
如果想知道某个范围是否包含在rangeSet的范围中,可以这样写:
boolean encloses = rangeSet.encloses(Range.closedOpen(18, 20)); System.out.println(encloses);//true.因为范围(18,20)包含在范围(15,20)中 encloses = rangeSet.encloses(Range.closedOpen(5, 20)); System.out.println(encloses);//false.因为范围(5,20)不被rangeSet中任何范围包含.
相关推荐
Guava还包含了一些其他实用功能,如事件总线(EventBus)用于解耦组件间的通信,RangeSet用于处理有序值的集合,Optional类用于表示可能为空的值,避免空指针异常。 总的来说,Google Guava库是一个功能强大的Java...
以上只是 Guava 30.1.1 版本中的一部分核心功能,实际使用中还有许多其他实用工具类,如 `Range`, `EventBus`, `RateLimiter` 等。Guava 的设计目标是提高代码质量和效率,通过提供这些工具类,开发者可以更加专注于...
通过Jackson Datatype Guava,我们可以让Jackson理解和序列化Guava库中的复杂数据结构,如Multimap、RangeSet、Optional等。这极大地提高了JSON处理的灵活性和效率。 Jackson Datatype Collections模块则专注于对...
Guava 提供了 Range 和 RangeSet 类,用于处理数值范围,特别适合在数据分析和统计场景中使用。 **9. 其他工具** Guava 还包含了如事件监听、服务加载、反射工具、时间戳处理等其他实用工具,为 Java 开发提供了全...
例如,Guava库提供了一个`Range`类,它支持区间操作并提供了丰富的API。通过阅读源码,我们可以学习到专业和高效的区间处理方式。 至于“工具”标签,可能暗示了存在一些工具或库可以帮助我们处理区间相关的任务。...