从重叠范围创建 Guava ImmutableRangeSet

Create Guava ImmutableRangeSet from overlapping ranges

显然 Guava 的 ImmutableRangeSet 无法存储重叠范围。这是有道理的,但是是否有 resolve/merge 重叠范围的接口,然后将结果范围放入 ImmutableRangeSet?

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

您能否更具体地说明您的用例?我 猜想 你有一个范围的集合,你正在尝试使用 copyOf 方法创建 ImmutableRangeSet,如果范围重叠,它会抛出 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);