转换scala地图字符串 - >字符串到字符串 - >地图

时间:2016-08-04 21:18:57

标签: scala

我正在尝试转换以下scala代码?

val orig = Map("command.stamp" -> 5, "command.another" -> "0", "level1.level2.level3" -> 10) which would translate to 

到地图。新地图需要支持多种价值类型和多于两个级别

val newMap = Map("command" -> Map("stamp" -> 5, "another" -> "0"), "level1" -> Map("level2" -> Map("level3" -> 10)))

此外,我必须将其转换为json。一直在使用Json.toJson(newMap),但它可能有多种类型。

4 个答案:

答案 0 :(得分:3)

scala> map.groupBy(_._1.split('.')(0))
          .mapValues(_ map { case(k, v) => (k.split('.')(1), v) })
res1: scala.collection.immutable.Map[String,scala.collection.immutable.Map[String,Int]] = 
          Map(command -> Map(stamp -> 5, another -> 0))

答案 1 :(得分:1)

我会这样做

map.foldLeft(Map[String,Map[String,Int]]()) {
    case (map, (k,v)) =>
      val keys = k.split('.')
      map + ((keys(0), map.getOrElse(keys(0), Map[String,Int]()) + (keys(1) -> v)))
  }

答案 2 :(得分:0)

假设您总是使用关键模式“one.two”,这将起作用:

val orig = Map("command.stamp" -> 5, "command.another" -> 0)

newMap = orig.foldLeft(immutable.Map[String, Map[String, Int]]())((prev, elem) => {
  val ar = elem._1.split('.')
  prev.get(ar(0)) match {
    case None => (prev + (ar(0) -> immutable.Map((ar(1), elem._2))))
    case Some(entry) =>
      prev + (ar(0) -> (immutable.Map((ar(1), elem._2)) ++ entry))
  }
})

基本上Iam折叠并传播输出图。第一种情况只是检查,如果还没有该密钥的条目。否则,如果存在,则将提取并显式附加值映射。 它不知道这是否是最好的解决方案。我想到了带有zip和其他迭代方法的版本,但没有。

答案 3 :(得分:0)

我们假设export CPLUS_INCLUDE_PATH="$CPLUS_INCLUDE_PATH:/usr/include/python2.7/" export BOOST_ROOT='/usr/Cellar/boost/1.61.0/' export BOOST_INC="/usr/Cellar/boost/1.61.0/include" export BOOST_LIB="/usr/Cellar/boost/1.61.0/lib" 添加另一个前缀组用于演示目的:

testMap

我们可以先用“。”来标记。并按前缀分组,然后解析每个子图以去除前缀:

  val testmap:Map[String,Int] = Map("command.stamp" -> 5, "command.another" -> 0, 
                                    "command2.stamp2" -> 4, "command2.another2" -> 1)