【问题标题】:Extract gaps from a List of Range<Date>从 Range<Date> 列表中提取间隙
【发布时间】:2016-04-02 16:14:54
【问题描述】:

我有一个基于 Guava 库的Range&lt;Date&gt; 列表,它们从不重叠。

  • 2001-01-10 &rightarrow; 2001-01-15
  • 2001-01-20 &rightarrow; 2001-01-22
  • 2001-01-28 &rightarrow; 2001-01-29

那么,我有一个参考范围:

  • 2001-01-01 &rightarrow; 2001-01-31

我想找出列表和参考范围之间的所有排他差距:

  • 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

对于这个例子,Date 对象很简单,但实际上它们的格式可能会有所不同,具体取决于它们的 ChronoUnit。

是否有正确的方法可以在不进行过多编码的情况下获得此结果?

【问题讨论】:

  • 列表中的范围可以重叠吗?
  • 不,我在添加时合并它们,所以输入列表是干净的。
  • 仅供参考:Guava 的 TreeRangeSet 可以为您合并/合并它们。详情请见github.com/google/guava/wiki/…
  • 对,但我认为我不能将它们与 TreeSet 合并,因为这些范围是由数据库记录支持的。我必须相应地合并它们并更新数据库。另一方面,间隙没有物理存储。

标签: java algorithm guava date-range


【解决方案1】:

我的方法是这样的

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

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

【讨论】:

  • 非常感谢。我完全忽略了 RangeSet 对象。
【解决方案2】:

您可以从Range&lt;Date&gt; 列表中create/buildRangeSet 使用它的complement()subRangeSet(Range) 来获得您参考范围内的独家空白:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 2019-10-27
    • 2022-11-27
    • 1970-01-01
    相关资源
    最近更新 更多