gpt4 book ai didi

scala - 识别 Scala 序列中的连续区间

转载 作者:行者123 更新时间:2023-12-01 10:38:03 25 4
gpt4 key购买 nike

假设我有一系列 joda 时间间隔:

Seq(
Interval(00, 01),
Interval(01, 02),
Interval(02, 04),
Interval(04, 06),
Interval(07, 09), // continuous sequence is broken
Interval(09, 10),
Interval(11, 14), // continuous sequence is broken
Interval(15, 20), // continuous sequence is broken
Interval(20, 24)
)

我想查看这个序列并取回一个 Seq[Seq[Interval]] ,它给了我连续的序列和非连续的序列,例如:
Seq(
Seq(Interval(00,01),Interval(01,02),Interval(02,04)Interval(04,06)),
Seq(Interval(07,09),Interval(09,10)),
Seq(Interval(11,14)),
Seq(Interval(15,20),Interval(20,24))
)

我确实想出了一些递归,但它只是在找到一个非连续间隔后中断!有什么线索吗?

最佳答案

我相信这是 foldLeft 的候选人。随着您的进行,迭代构建所需结构的间隔。我发现将新项目添加到 seq 的头部更容易,因此在最后使用 reverse :

case class Interval(a: Int, b: Int)

val intervals = Seq(
Interval(0, 1),
Interval(1, 2),
Interval(2, 4),
Interval(4, 6),
Interval(7, 9), // continuous sequence is broken
Interval(9, 10),
Interval(11, 14), // continuous sequence is broken
Interval(15, 20), // continuous sequence is broken
Interval(20, 24)
)

intervals.foldLeft(Seq[Seq[Interval]]()){(acc, i) =>
if(acc.isEmpty){
Seq(Seq(i))
}else {
if(acc.head.head.b == i.a) {
(i +: acc.head) +: acc.tail
} else {
Seq(i) +: acc
}
}
}.map(_.reverse).reverse.foreach(println)

产生:
List(Interval(0,1), Interval(1,2), Interval(2,4), Interval(4,6))
List(Interval(7,9), Interval(9,10))
List(Interval(11,14))
List(Interval(15,20), Interval(20,24))

编辑:

使用模式匹配的替代方法:
intervals.foldLeft(Seq[Seq[Interval]]()){
case (Seq(Seq()), i) => Seq(Seq(i))
case (h :: tail, i) if h.head.b == i.a => (i +: h) +: tail
case (acc, i) => Seq(i) +: acc
}.map(_.reverse).reverse.foreach(println)

关于scala - 识别 Scala 序列中的连续区间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32455720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com