从范围列表<日期>中提取间隙

时间:2015-12-28 19:55:41

标签: java algorithm guava date-range

我有一个基于Guava库的Range<Date>列表,它们从不重叠。

  • 2001-01-10 2001-01-15
  • 2001-01-20 2001-01-22
  • 2001-01-28 2001-01-29

然后,我有一个参考范围:

  • 2001-01-01 2001-01-31

我想找到列表和参考范围之间的所有独占差距:

  • 2001-01-01 2001-01-10
  • 2001-01-15 2001-01-20
  • 2001-01-22 2001-01-28
  • 2001-01-29 2001-01-31

对于此示例,Date对象很简单,但实际上它们的格式可能因ChronoUnit而异。

是否有正确的方法可以在没有太多编码的情况下获得此结果?

2 个答案:

答案 0 :(得分:4)

我的方法就像

RangeSet<Date> rangeSet = TreeRangeSet.create();
rangeSet.add(referenceRange);
for (Range<Date> range : rangesToRemove) {
  rangeSet.remove(range);
}
for (Range<Date> exclusiveRange : rangeSet.asRanges()) {
   ...
}

如果你正确操作范围边界,你应该以你想要的格式得到它们。

答案 1 :(得分:3)

您可以在Range<Date>列表中create / build RangeSet并使用complement() subRangeSet(Range)来获取专属差距在您的参考范围内:

RangeSet<Date> exclusiveRangeSet = rangeSet.complement().subRangeSet(referenceRange);