Scala 将for循环转换为函数式样式
我有一个要求,在这里我有一个Scala 将for循环转换为函数式样式,scala,Scala,我有一个要求,在这里我有一个OffsetDateTime列表,我必须将列表中的每个项目与其他项目进行比较,这适用于列表中的每个项目,最后得到一个布尔值列表,我尝试了递归和foldLeft,但没有成功,最后我得到了for循环和可变列表缓冲区,我得到了我的解决方案,但代码不是函数式的,下面是我的代码: val sd1 = OffsetDateTime.of(LocalDateTime.of(2017, 4, 14, 6, 30, 22), ZoneOffset.ofHoursMinutes(5, 3
OffsetDateTime
列表,我必须将列表中的每个项目与其他项目进行比较,这适用于列表中的每个项目,最后得到一个布尔值列表,我尝试了递归
和foldLeft
,但没有成功,最后我得到了for
循环和可变列表缓冲区
,我得到了我的解决方案,但代码不是函数式的,下面是我的代码:
val sd1 = OffsetDateTime.of(LocalDateTime.of(2017, 4, 14, 6, 30, 22),
ZoneOffset.ofHoursMinutes(5, 30))
val ed1 = OffsetDateTime.of(LocalDateTime.of(2017, 4, 14, 9, 30, 20),
ZoneOffset.ofHoursMinutes(5, 30))
val sd2 = OffsetDateTime.of(LocalDateTime.of(2017, 4, 14, 10, 30, 22),
ZoneOffset.ofHoursMinutes(5, 30))
val ed2 = OffsetDateTime.of(LocalDateTime.of(2017, 4, 14, 11, 30, 22),
ZoneOffset.ofHoursMinutes(5, 30))
val sd3 = OffsetDateTime.of(LocalDateTime.of(2017, 4, 15, 7, 30, 22),
ZoneOffset.ofHoursMinutes(5, 30))
val ed3 = OffsetDateTime.of(LocalDateTime.of(2017, 4, 15, 9, 30, 22),
ZoneOffset.ofHoursMinutes(5, 30))
case class DT(st: OffsetDateTime, et: OffsetDateTime)
val x1 = DT(sd1, ed1)
val x2 = DT(sd2, ed2)
val x3 = DT(sd3, ed3)
val l: List[DT] = List(x1, x2, x3)
下面是for循环的解决方案,有人能帮我把下面的代码转换成函数式吗?谢谢
var lb = ListBuffer[Boolean]()
for(i <- l.indices) {
for(j <- i + 1 until l.size) {
val res = overlapping(l(i).st,l(i).et,l(j).st,l(j).et)
lb.append(res)
}
}
var lb=ListBuffer[Boolean]()
for(i你最后的“for循环”很好地转化为:
val lb=for{
i如果您的目的是在列表的迭代中获取当前
和下一个
元素,则可以使用幻灯片
。例如
scala> val myList = List(1,2,3,4,5)
myList: List[Int] = List(1, 2, 3, 4, 5)
scala> myList.sliding(2).foreach(print)
//List(1, 2)List(2, 3)List(3, 4)List(4, 5)
您可以通过调用l.combines(2)
方法来实现。它提供了一个遍历所有可能的元素对的迭代器:
scala> List(1,2,3).combinations(2) foreach println
List(1, 2)
List(1, 3)
List(2, 3)
因此,解决问题的代码如下所示:
l.combinations(2).map {
case List(DT(st1, et1), DT(st2, et2)) =>
overlapping(st1, et1, st2, et2)
}.toList
您可以使用l.tails
实现类似的效果,它会在列表的所有后缀上返回一个迭代器:
l.tails.flatMap {
case DT(st1, et1) :: tail => tail.map {
case DT(st2, et2) => overlapping(st1, et1, st2, et2)
}
case _ => Nil
}.toList
此外,按索引访问列表(例如,l(i)
)的性能非常差,您应该尽量避免使用它
l.tails.flatMap {
case DT(st1, et1) :: tail => tail.map {
case DT(st2, et2) => overlapping(st1, et1, st2, et2)
}
case _ => Nil
}.toList