简介
RangeSet用来处理一系列不连续,非空的range。当添加一个range到一个RangeSet之后,任何有连续的range将被自动合并,而空的range将被自动去除。
RangeSet类是一个接口,需要用它的子类来声明一个RangeSet型的对象,实现了RangeSet接口的类有ImmutableRangeSet和TreeRangeSet,ImmutableRangeSet是一个不可修改的RangeSet,而TreeRangeSet是利用树的形式来实现。
使用
RangeSet<Integer> rangeSet = TreeRangeSet.create(); rangeSet.add(Range.closed(1, 10)); System.out.println("rangeSet:"+rangeSet); rangeSet.add(Range.closedOpen(11, 15)); System.out.println("rangeSet:"+rangeSet); rangeSet.add(Range.open(15, 20)); System.out.println("rangeSet:"+rangeSet); rangeSet.add(Range.openClosed(-1, 1)); System.out.println("rangeSet:"+rangeSet); rangeSet.remove(Range.open(5, 10)); System.out.println("rangeSet:"+rangeSet);
结果
rangeSet:[[1‥10]] rangeSet:[[1‥10], [11‥15)] rangeSet:[[1‥10], [11‥15), (15‥20)] rangeSet:[(-1‥10], [11‥15), (15‥20)] rangeSet:[(-1‥5], [10‥10], [11‥15), (15‥20)]
遍历
Set ranges = rangeSet.asRanges(); Iterator<Range> iterator = ranges.iterator(); while (iterator.hasNext()){ Range next = iterator.next(); System.out.println(next); }
结果
(-1‥5] [10‥10] [11‥15) (15‥20)
其他操作
如果我们需要得到rangeSet互补的范围,我们可以用RangeSet提供的complement()方法。
RangeSet complement = rangeSet.complement(); System.out.println(complement);
[(-∞‥-1], (5‥10), (10‥11), [15‥15], [20‥+∞)]
如果想知道某个元素是在rangeSet中哪个范围里面:
Range integerRange = rangeSet.rangeContaining(17); System.out.println(integerRange);//输出(15‥20),因为17被包含在(15‥20)中,所以输出这个范围。