将for循环转换为功能样式

时间:2018-04-15 18:10:14

标签: scala

我有一个要求,我有一个OffsetDateTime列表,我必须将列表中的每个项目与每个其他项目进行比较,这适用于列表中的每个项目,最后得到布尔列表,我尝试使用recursionfoldLeft,但它没有成功,最后我得到for循环和可变ListBuffer,我得到了我的解决方案,但代码不起作用风格,这是我的代码:

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)
  }
}

3 个答案:

答案 0 :(得分:3)

您的上一个“for-loop”很好地转换为for-comprehension

val lb = for{
  i <- l.indices
  j <- i + 1 until l.size
} yield overlapping(l(i).st,l(i).et,l(j).st,l(j).et)

答案 1 :(得分:0)

如果您的目的是在列表的迭代中获取currentnext元素,则可以使用slide来实现此目的。例如

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)

答案 2 :(得分:0)

您可以通过调用l.combinations(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),性能非常差,您应该尽量避免使用它。