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

Java 从范围列表中提取间隙<;日期>;,java,algorithm,guava,date-range,Java,Algorithm,Guava,Date Range,我有一个基于番石榴库的范围的列表,它们从不重叠 2001-01-10&rightarrow2001-01-15 2001-01-20&rightarrow2001-01-22 2001-01-28&rightarrow2001-01-29 然后,我有一个参考范围: RangeSet<Date> exclusiveRangeSet = rangeSet.complement().subRangeSet(referenceRange); 2001-01-01&rightarrow

我有一个基于番石榴库的
范围的列表,它们从不重叠

  • 2001-01-10
    &rightarrow
    2001-01-15
  • 2001-01-20
    &rightarrow
    2001-01-22
  • 2001-01-28
    &rightarrow
    2001-01-29
然后,我有一个参考范围:

RangeSet<Date> exclusiveRangeSet = rangeSet.complement().subRangeSet(referenceRange);
  • 2001-01-01
    &rightarrow
    2001-01-31
我想找出列表和参考范围之间的所有独家差距:

RangeSet<Date> exclusiveRangeSet = rangeSet.complement().subRangeSet(referenceRange);
  • 2001-01-01
    &rightarrow
    2001-01-10
  • 2001-01-15
    &rightarrow
    2001-01-20
  • 2001-01-22
    &rightarrow
    2001-01-28
  • 2001-01-29
    &rightarrow
    2001-01-31
在本例中,日期对象很简单,但实际上,它们的格式可能会因其计时单位而异


有没有一种不需要太多编码就能得到这个结果的正确方法?我的方法是这样的

RangeSet<Date> rangeSet = TreeRangeSet.create();
rangeSet.add(referenceRange);
for (Range<Date> range : rangesToRemove) {
  rangeSet.remove(range);
}
for (Range<Date> exclusiveRange : rangeSet.asRanges()) {
   ...
}
RangeSet RangeSet=TreeRangeSet.create();
rangeSet.add(referenceRange);
用于(范围:rangesToRemove){
范围集。删除(范围);
}
对于(范围独占性:rangeSet.asRanges()){
...
}
如果正确操作范围边界,则应以所需的格式获取它们。

您可以从
范围列表中/a并使用其与获取参考范围中的独占间隙:

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

列表中的范围是否重叠?否,添加时我会合并它们,因此输入列表是干净的。仅供参考:番石榴树集可以为您合并/合并它们。有关详细信息,请参阅。对,但我不认为我可以将它们与TreeSet合并,因为范围由数据库记录支持。我必须相应地合并它们并更新数据库。另一方面,间隙不是物理存储的。非常感谢。我完全忽略了RangeSet对象。