Java 在Joda时间内优化多个间隔

Java 在Joda时间内优化多个间隔,java,algorithm,jodatime,Java,Algorithm,Jodatime,我有一堆Joda time对象存储在一个列表中。所有这些间隔都有有效的开始和结束瞬间。这些层段之间可以有任何重叠、邻接甚至间隙 我想将这些间隔展平(优化)到最大可能。我的意思是,我必须生成其他间隔对象,它们将表示非常相同的从到信息,但没有冗余 例如: I1:2012-01-12T05:00:00.000/2013-03-18T14:00:00.000 I2:2012-04-12T04:00:00.000/2013-02-10T06:00:00.000 I3:2015-12-12T04:00:00

我有一堆Joda time对象存储在一个列表中。所有这些间隔都有有效的开始和结束瞬间。这些层段之间可以有任何重叠、邻接甚至间隙

我想将这些间隔展平(优化)到最大可能。我的意思是,我必须生成其他间隔对象,它们将表示非常相同的从到信息,但没有冗余

例如:

I1:2012-01-12T05:00:00.000/2013-03-18T14:00:00.000

I2:2012-04-12T04:00:00.000/2013-02-10T06:00:00.000

I3:2015-12-12T04:00:00.000/2016-12-12T06:00:00.000

应产生:

2012-01-12T05:00:00.000/2013-03-18T14:00:00.000

I2_o:2015-12-12T04:00:00.000/2016-12-12T06:00:00.000

(I2绝对在I1之内,因此可以忽略,结果两个有一个间隙)

我知道Interval类中的三个方法可以帮助我,但我想我需要一个更通用的算法来搜索某些类型的区间之间的重叠,比如普通数字等。
提前谢谢

按开始时间对间隔进行排序,并循环遍历间隔。如果间隔i的开始时间小于或等于间隔i-1的结束时间,则可以将它们合并为一个间隔,其结束时间是两个原始间隔中最大的结束时间。(将生成的间隔放入新列表中,这样您就可以安全地循环原始间隔的排序列表,而无需修改它。)

Scala模式:

intervals.sortWith(_.start isAfter _.start).foldLeft(Seq[Interval]()) {
  case (Nil, e) => Seq(e)
  case (h :: t, e) if ((h gap e) == null) =>
    new Interval(e.interval.start, h.interval.end) +: t
  case (a, e) => e +: a
}

更多通用算法解释

谢谢,这是一个伟大的核心步骤!一个小修正:您必须检查i和i-1的开始时间,并使用较早的时间作为结果的开始时间。此外,结果间隔可能必须“重新优化”,因此您提到的核心步骤可能也必须对结果执行。最后,这个步骤应该处理独立的时间间隔,这些时间间隔不与其他时间间隔共享。不管怎样,你的回答给了我灵感,谢谢@亚伯拉罕:是的;我本可以更精确一些(但显然,你知道了)-你总是跟踪你正在建立的当前间隔,并且总是将间隔I与当前间隔进行比较,或者合并间隔,或者将I设置为新的当前间隔。@Gyaraham按开始时间对间隔进行排序意味着“有点修正”没有必要;排序较早的时间间隔具有较早的开始时间。虽然此代码可能会回答此问题,但提供有关此代码为什么和/或如何回答此问题的其他上下文将提高其长期价值。
seq.sortWith(_.getStart isAfter _.getStart).foldLeft(Seq[Interval]()) {
  case (Nil, e) => Seq(e)
  case (h :: t, e) if (h gap e) == null =>
    val ins = if (h.contains(e)) {
      h
    } else if (e.contains(h)) {
      e
    } else {
      new Interval(e.getStart, h.getEnd)
    }
    ins +: t
  case (a, e) => e +: a
}