我有一个包含这样的地图的列表:
List = {[name:'A:B:C'],[name:'A:B:D'],[name:'A:B:E'],[name:'A:F' ]}
我希望将此列表转换为这样的地图:
Map = [{
'name': 'A',
'child': [ {
'name': 'B',
'child' : [
{'name':'C', 'child':[]}, {'name': 'D', 'child':[]}, {'name': 'E', 'child':[]}
]
},
{
'name':'F',
'child': []
}]
}]
在groovy中。有什么想法吗?
答案 0 :(得分:0)
这是一种方法......我觉得可能有更容易的路线来达到相同的答案; - )
def list = [ [ name:'A:B:C' ], [ name:'A:B:D' ], [ name:'A:B:E' ], [ name:'A:F' ] ]
Map convertToMap( List list ) {
def map = [child:[]]
list.name*.tokenize( ':' ).each { names ->
def current = map
names.each { name ->
def next = current.child.find { it.name == name }
if( !next ) {
next = [ name: name, child:[] ]
current.child << next
}
current = next
}
}
map.child[ 0 ]
}
convertToMap( list )
我会想到......
你可以做到这一点,但我们可能会有点深奥; - )
def list = [ [ name:'A:B:C' ], [ name:'A:B:D' ], [ name:'A:B:E' ], [ name:'A:F' ] ]
def tree = { [:].withDefault{ owner.call() } }
def map = list.name*.tokenize( ':' ).inject( tree() ) { t, names ->
names.inject( t ) { tr, name -> tr."$name" }
t
}.collectEntries { k, v ->
[ name:k, child:v.collect( { owner }() ) ]
}