首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将路径->值映射转换为树状映射

将路径->值映射转换为树状映射
EN

Stack Overflow用户
提问于 2013-01-04 14:35:43
回答 1查看 239关注 0票数 0

有一行嵌套路径作为键,如下所示:

代码语言:javascript
复制
Map(
  "manufacturer" -> "Magnavox",
  "processor.address-space" -> 8,
  "gpu.processor.address-space" -> 8,
  "processor.speed" -> 150
)

如何才能成为一个惯用的Scala,用于根据路径对值进行分组,并将其转换为:

代码语言:javascript
复制
Map(
  "gpu" -> Map(
             "processor" -> Map("address-space" -> 8)
           ),
  "processor" -> Map(
                   "speed" -> 150,
                   "address-space" -> 8
                 ),
  "manufacturer" -> "Magnavox"
)

注意:所有的键都是叶路径,所以在这种情况下不允许使用gpu -> "something"作为输入。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-04 17:52:02

代码语言:javascript
复制
def group( m: Map[String, Any] ): Map[String, Any] = {
  def groupImpl( dic: Map[Array[String], Any] ): Map[String, Any] = {
    dic.groupBy(_._1.head).mapValues{ dic: Map[Array[String], Any] =>
      require( !dic.isEmpty)
      if ( dic.size == 1 && dic.head._1.size == 1) {
        dic.head._2
      }
      else {
        groupImpl(
          dic.map{ case (k,v) => 
            require(!k.tail.isEmpty)
            k.tail -> v
          }
        )
      }
    }
  }
  groupImpl( m.map{ case (k,v) => k.split("\\.") -> v} )
}

一些测试:

代码语言:javascript
复制
scala>
group(
  Map(
    "manufacturer" -> "Magnavox",
    "processor.address-space" -> 8,
    "gpu.processor.address-space" -> 8,
    "processor.speed" -> 150,
    "gpu.processor.foo" -> "bar"
  )
)

res2: Map[String,Any] = Map(manufacturer -> Magnavox, processor -> Map(speed -> 150, address-space -> 8), gpu -> Map(processor -> Map(foo -> bar, address-space -> 8)))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14159093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档