Как получить инклюзивный результат от разницы в Guava RangeSet? - PullRequest
0 голосов
/ 07 мая 2018
ImmutableRangeSet<Integer> rangeSet1 = ImmutableRangeSet.of(Range.closed(1, 10));
ImmutableRangeSet<Integer> rangeSet2 = ImmutableRangeSet.of(Range.closed(3, 6));
ImmutableRangeSet<Integer> result = rangeSet1.difference(rangeSet2);

Результат разницы rangeSet1 и rangeSet2 равен [[1..3), (6..10]]

Но мне нужно получить результат с включенными диапазонами: [[1..2], [7..10]]

1 Ответ

0 голосов
/ 09 мая 2018

Мое решение - создать ContiguousSet из каждого диапазона RangeSet для преобразования в закрытый диапазон.

    ImmutableRangeSet<Integer> rangeSet1 = ImmutableRangeSet.of(Range.closed(1, 10));
    ImmutableRangeSet<Integer> rangeSet2 = ImmutableRangeSet.of(Range.closed(3, 6));

    ImmutableRangeSet<Integer> difference = rangeSet1.difference(rangeSet2);
    ImmutableRangeSet<Integer> closedRangeSet = difference.asRanges().stream()
            .map(range -> {
                DiscreteDomain<Integer> domain = DiscreteDomain.integers();
                return ContiguousSet.create(range, domain).range(BoundType.CLOSED, BoundType.CLOSED);
            })
            .collect(Collectors.collectingAndThen(toSet(), ImmutableRangeSet::copyOf));

    System.out.println(closedRangeSet);
...