我有一堆Joda time Interval对象存储在List中。所有这些间隔都有有效的开始和结束时刻。这些间隔可以有任何重叠,紧密甚至间隙。
我想尽可能地平整(优化)这些间隔。我的意思是,我必须生成其他Interval对象,这些对象代表从 - 到信息,但没有冗余。
例如:
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
应该产生:
I1_o: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类中的三个方法可以帮助我,但我想我需要一个更通用的算法,可以搜索某种间隔之间的重叠,比如普通数字等。 提前谢谢!
答案 0 :(得分:5)
按开始时间对间隔进行排序,并循环显示间隔。如果间隔 i 的开始时间小于或等于间隔 i-1 的结束时间,则它们可以合并为一个结束时间最长的时间间隔两个原始间隔的时间。 (将生成的区间放入新的列表中,以便您可以安全地遍历已排序的原始区间列表而无需对其进行修改。)
答案 1 :(得分: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
}
答案 2 :(得分:0)
答案 3 :(得分:0)
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
}