Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 路径的变换映射->;将值转换为树状图_Scala_Functional Programming - Fatal编程技术网

Scala 路径的变换映射->;将值转换为树状图

Scala 路径的变换映射->;将值转换为树状图,scala,functional-programming,Scala,Functional Programming,具有嵌套路径作为键的线,如: Map( "manufacturer" -> "Magnavox", "processor.address-space" -> 8, "gpu.processor.address-space" -> 8, "processor.speed" -> 150 ) 如何将一个惯用的Scala用于根据路径对值进行分组,并将其转换为: Map( "gpu" -> Map( "processor" -

具有嵌套路径作为键的线,如:

Map(
  "manufacturer" -> "Magnavox",
  "processor.address-space" -> 8,
  "gpu.processor.address-space" -> 8,
  "processor.speed" -> 150
)
如何将一个惯用的Scala用于根据路径对值进行分组,并将其转换为:

Map(
  "gpu" -> Map(
             "processor" -> Map("address-space" -> 8)
           ),
  "processor" -> Map(
                   "speed" -> 150,
                   "address-space" -> 8
                 ),
  "manufacturer" -> "Magnavox"
)
注意:所有键都是叶路径,因此在这种情况下不允许输入
gpu->“something”

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} )
}
一些测试:

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)))