我正在尝试转换以下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),但它可能有多种类型。
答案 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)