1

次のリストがあります (ほんの一例です。リストの深さは任意です)。

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(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)))

よろしくお願いします。

4

1 に答える 1

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)
    }
  )
}
于 2013-04-11T15:08:49.903 に答える