繁体   English   中英

如何用尾部映射列表项 [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 所说,tails 是你的朋友

(xs zip xs.tails.toList) map {case (h, t) => println("Head: " + h + " Tail: " + t)}

.toList 是一个遗憾,虽然


暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM