[英]How to map list items with their tail [Scala]
如何将列表中的每个项目与其剩余的尾部迭代映射? 伪代码示例:
val list = List(1,2,3,4)
list.foreach((head, tail) => println(s"head= $head, tail= $tail"))
// head= 1, tail = List(2, 3, 4)
// head= 2, tail = List(3, 4)
// head= 3, tail = List(4)
// head= 4, tail = List()
最简单的方法似乎是旧的for
循环,它的优点是它为您插入了一个过滤步骤,因此您在迭代尾部时不会在Nil
情况下崩溃:
for (h :: t <- (1 to 4).toList.tails) println(s"head: $h tail: $t")
给出:
head: 1 tail: List(2, 3, 4)
head: 2 tail: List(3, 4)
head: 3 tail: List(4)
head: 4 tail: List()
如果您实际上不需要println
副作用,则for-yield
只会为您提供值。
def rec(l: List[Int]) : Unit = {
l match {
case head::tail => println(s"head= $head, tail= $tail")
rec(tail)
case _ =>
}
}
scala> rec(l)
head= 1, tail= List(2, 3, 4)
head= 2, tail= List(3, 4)
head= 3, tail= List(4)
head= 4, tail= List()
一个(对我来说)更直接的答案。 正如@LuisMiguelMejíaSuárez 所说,tails 是你的朋友
(xs zip xs.tails.toList) map {case (h, t) => println("Head: " + h + " Tail: " + t)}
.toList 是一个遗憾,虽然
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.