Java 在Joda时间内优化多个间隔
我有一堆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类中的三个方法可以帮助我,但我想我需要一个更通用的算法来搜索某些类型的区间之间的重叠,比如普通数字等。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
提前谢谢 按开始时间对间隔进行排序,并循环遍历间隔。如果间隔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
}