从重叠范围创建Guava ImmutableRangeSet

时间:2017-07-12 19:24:19

标签: guava

显然,番石榴ImmutableRangeSet无法存储重叠范围。这是有道理的,但是是否有一个界面来解析/合并重叠范围,然后将结果范围放入ImmutableRangeSet

目前我正在构建一个TreeRangeSet,它会自动合并重叠范围,并将其作为参数传递给ImmutableRangeSet.builder().addAll()。这个过程有效,但是为了解决重叠范围似乎有点过于间接。

1 个答案:

答案 0 :(得分:3)

您能更具体地了解您的用例吗?我猜测您有一系列范围,并且您尝试使用ImmutableRangeSet方法创建copyOf,这会在重叠范围的情况下抛出IAE。让我们看看这个测试用例:

@Test
public void shouldHandleOverlappingRanges()
{
    //given
    ImmutableList<Range<Integer>> ranges = ImmutableList.of(
            Range.closed(0, 2),
            Range.closed(1, 4),
            Range.closed(9, 10)
    );
    //when
    ImmutableRangeSet<Integer> rangeSet = ImmutableRangeSet.copyOf(ranges);
    //then
    assertThat(rangeSet.asSet(DiscreteDomain.integers()))
            .containsOnly(0, 1, 2, 3, 4, 9, 10);
}

失败
java.lang.IllegalArgumentException: 
Overlapping ranges not permitted but found [0..2] overlapping [1..4]

在这种情况下,您应该使用unionOf代替copyOf并且它会通过:

//when
ImmutableRangeSet<Integer> rangeSet = ImmutableRangeSet.unionOf(ranges);