有一行嵌套路径作为键,如下所示:
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"作为输入。
发布于 2013-01-04 17:52:02
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)))https://stackoverflow.com/questions/14159093
复制相似问题