代码之家  ›  专栏  ›  技术社区  ›  dks551

如何在scala中将嵌套地图制作为键和值的点分隔字符串

  •  -1
  • dks551  · 技术社区  · 7 年前

    Map[String, Any] Map 等等

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

    转换此嵌套数据的最佳方法是什么 地图 地图

    Map("a.b.c" -> 1, "a.b.d" -> 4)
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   dk14    7 年前

    只需像在任何其他编程语言中一样使用递归(它不是Scala特有的)。

    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) 提出的解决方案不是尾部递归的(因此可能会在非常深的树上引发堆栈溢出)-您可以编写尾部递归版本作为练习。提示-您需要一个累加器来进行结果收集(或者使用可变缓冲区,idn,也许您并不真正喜欢函数式编程,并且被雇主强迫使用Scala:)。

    2) List performance

    @unchecked