【发布时间】:2017-03-15 05:22:25
【问题描述】:
在了解了 scala 中的一些功能后,我尝试从列表中修补元素:
val aList: List[List[Int]] = List(List(7,2,8,5,2),List(8,7,3,3,3),List(7,1,4,8,8))
如果 8 的位置是头部,我想要做的是用右邻居元素替换 8,否则如果 8 是尾部,则用左邻居替换。
更新后的 aList 应该是:
List[List[Int]] = List(List(7,2,2,5,2),List(7,7,3,3,3),List(7,1,4,4,4))
我试过以下代码:
def f(xs: List[Int]) = xs match {
case x0 :: x1 :: x2 :: x3 :: x4 => List(x0,x1,x2,x3,x4)
case 8 :: x1 :: x2 :: x3 :: x4 => List(x1,x1,x2,x3,x4)
case x0 :: 8 :: x2 :: x3 :: x4 => List(x0,x0,x2,x3,x4)
case x0 :: x1 :: 8 :: x3 :: x4 => List(x0,x1,x1,x3,x4)
case x0 :: x1 :: x2 :: 8 :: x4 => List(x0,x1,x2,x2,x4)
case x0 :: x1 :: x2 :: x3 :: 8 => List(x0,x1,x2,x3,x3)
}
aList.flatMap(f)
类型不匹配,因为类型是Product with java.io.Serializable,但需要的是scala.collection.GenTraversableOnce
您能解释一下有什么区别以及它是如何工作的吗?
【问题讨论】:
-
“如果 8 的位置是头部,则将 8 替换为下一个前向元素,如果 8 是尾部,则将其替换为前一个元素” - 如果它不是第一个也不是最后一个,你想做什么?我看到您已替换 (7,2,8,5,2) -> (7,2,2,5,2) - 但您为什么要这样做?进行替换的规则是什么?请澄清。
标签: scala collections serializable flatmap