微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Groovy:如何按2个不同的标准对地图值进行分组?

如何按2个不同的标准对地图值进行分组以获得下面的输出

def listofMaps = [
  [name:'Clark',city:'London',hobby: 'chess'],[name:'Sharma',hobby: 'design'],[name:'Maradona',city:'LA',hobby: 'poker'],[name:'Zhang',city:'HK',[name:'Ali',city: 'HK',[name:'Liu',[name:'Doe',[name:'Smith',[name:'Johnson',city: 'London',[name:'Waters',[name:'Hammond',[name:'Rogers',]

>团体订单:爱好,城市

poker
    London
        Smith
        Johnson
    LA
        Maradona
        Waters
    HK
        Ali
        Liu
design
    London
        Sharma
    LA
        Doe
        Hammond
    HK
chess
    London
        Clark   
    LA
        Rogers
    HK
        Zhang

>团体订单:城市,爱好

London
    poker
        Smith
        Johnson
    design
        Sharma
    chess
        Clark
LA
    poker
        Maradona
        Waters
    design
        Doe
        Hammond
    chess
        Rogers

HK
    poker
        Ali
        Liu
    design
    chess
        Zhang

编辑:

我真正需要的是迭代有效循环组结构的方法,并能够构造结果(组/子组/名称).

就像是 :

>对于每个组,打印/输出组名;
>对于组内的每个子组,打印/输出子组名称
>在每个子组内,打印名称.

它将产生上述结果.

作为一个好的方面,我想对整个数据结构(组和名称)进行排序.

解决方法

对于第一种情况:

result = map.groupBy( { it.hobby },{ it.city } )

而对于第二个:

result = map.groupBy( { it.city },{ it.hobby } )

您将最终得到地图中的原始值而不仅仅是名称,但您将能够:

result[ 'poker' ][ 'HK' ].name

得到结果

["Ali","Liu"]

顺便说一句:这个form of groupBy仅在Groovy 1.8.1之后才可用,所以如果你坚持使用早期版本,这将无效

编辑2

根据您在下面的评论,您可以执行以下操作:

result.each { a,b ->
  println "$a"
  b.each { c,d ->
    println "  $c"
    d.each {
      println "    $it.name"
    }
  }
}

这与GVdP在他的回答中的逻辑相同,但我觉得使用groupBy有多个参数,就像我在这里使你的代码更具可读性和明显的意图

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐