显然,番石榴ImmutableRangeSet
无法存储重叠范围。这是有道理的,但是是否有一个界面来解析/合并重叠范围,然后将结果范围放入ImmutableRangeSet
?
目前我正在构建一个TreeRangeSet
,它会自动合并重叠范围,并将其作为参数传递给ImmutableRangeSet.builder().addAll()
。这个过程有效,但是为了解决重叠范围似乎有点过于间接。
答案 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);