从重叠范围创建 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);
显然 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);