如何用尾巴映射列表项[Scala]
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 所说,尾巴是你的朋友
(xs zip xs.tails.toList) map {case (h, t) => println("Head: " + h + " Tail: " + t)}
可惜的是.toList
如何用它的剩余尾部迭代地映射列表中的每个项目?伪代码示例:
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 所说,尾巴是你的朋友
(xs zip xs.tails.toList) map {case (h, t) => println("Head: " + h + " Tail: " + t)}
可惜的是.toList