将字符串拆分为groovy中的多个映射/列表

时间:2014-03-27 11:53:15

标签: groovy

我有一个包含这样的地图的列表:

  

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中。有什么想法吗?

1 个答案:

答案 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 }() ) ]
}