2017-09-18 7 views
-1

私はMap[String, Any]を持っています。値は別のMapなどとすることができます。スカラのキーと値のドット区切り文字列としてネストマップを作成する方法

val m: Map[String, Any] = Map("a" -> Map("b" -> Map("c" -> 1, "d" -> 4))) 

(それはScalaの固有のものではありません)

Map("a.b.c" -> 1, "a.b.d" -> 4) 
+0

実装したときにはどうなりましたか? – Dima

+0

私はスカラーにとって非常に新しいです。だから私はそれを実装することができませんでした。 – Deepakkumar

+0

さて、試しましたか? – Dima

答えて

3

のような値だけで、他のプログラミング言語のように再帰を使用して別のMapに、このネストされたMapを変換するための最良の方法は何ですか。あなたは練習として末尾再帰バージョンを書くことができ - ところで

val m: Map[String, Any] = Map("a" -> Map("b" -> Map("c" -> 1, "d" -> 4))) 

def traverse(el: Any, acc: List[String] = List.empty[String]): Map[String, Int] = el match { 
    case leaf: Int => Map(acc.reverse.mkString(".") -> leaf) 
    case m: Map[String, Any] => m flatMap { 
    case (k, v) => traverse(v, k :: acc) 
    } 
} 

traverse(m) 

res2_2: Map[String, Int] = Map("a.b.c" -> 1, "a.b.d" -> 4) 

1)提示ソリューションは、(そう)非常に深い木上のスタックオーバーフローを投げるかもしれない末尾再帰的ではありません。ヒント - コレクションを生成するためのアキュムレータが必要です(または、可変バッファを使用してください。多分あなたは関数型プログラミングではなく、雇用者によってScalaを使用する必要があります)。あなたは、少なくとも何らかの形でこの些細なアルゴリズムを実装しようとする怠惰だったよう

2)Listが)performanceのだって(アキュムレータには不適切な構造であり、私は、あまり一般的なものを使用するだけで怠惰でした。私はそこに重複した質問があるはずだが、やはりそれを探すのは怠惰だと思う。

3)@unchecked注釈は、私のコードのどこかで適切でしょう(どこですか?)。パターンマッチングのデフォルトケース(テストケースを構築して、なぜ自分の関数が分からないのか分かります)。

関連する問題