“替换”与Scala中任意嵌套List中的谓词匹配的元素

时间:2013-04-11 15:02:35

标签: list scala recursion nested tail-recursion

我有以下列表(只是一个例子 - 列表可以是任意深度);

val foo = List(1, List(2, List(3, 4)), List(5, List(6, List(7, List(8,9,10)))))

我想遍历列表,并使用谓词中的某个值“替换”和元素。

的影响
map(case 4 => 42 case x => x)

我希望它产生一个新的List,看起来如下;

List(1, List(2, List(3, 42)), List(5, List(6, List(7,List(8,9,10)))))

我试图通过下面的递归函数来做到这一点;

def copyListReplace(tree: List[Any], p: Any => Any): List[Any] = {
  tree.map(x =>
    x match {
      case y: List[Any] => copyList(y.tail, p)
      case t => p(t)
    }
  )
}

但我没有得到理想的结果;

scala>println(copyListReplace(foo, (x => x match{ case 4 => 42 case _ => t})))    
List(1, List(List(42)), List(List(7)))

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您必须从递归函数中删除y.tail并使用y(映射整个嵌套列表 - 不要跳过第一个元素)。

def copyListReplace(tree: List[Any], p: Any => Any): List[Any] = {
  tree.map(x =>
    x match {
      case y: List[Any] => copyListReplace(y, p)
      case t => p(t)
    }
  )
}