【问题标题】:How to Collect similar items of a list in groovy如何在groovy中收集列表的相似项目
【发布时间】:2014-01-24 20:25:08
【问题描述】:

我有一个如下列表

    ordersList=[[id:1, amount:1000, salesPerson:'XYZ'], 
                [id:2, amount:3000, salesPerson:'XYZ'], 
                [id:3, amount:1000, salesPerson:'ABC']
                 ...n items

               ];

我想收集具有相同属性“salesPerson”价值的项目以及该“salesPerson”的所有订单金额的总和,最后我想要下面的列表,意味着应该为每个“salesPerson”创建一个列表并且应该包含所有带有'salesPerson'的订单

最后,我期望的列表是

 salesPersonOrdersList = [xyzSalesPersonOrdersList, abcSalesPersonOrdersList]


    xyzSalesPersonOrdersList = [[name:'XYZ'], orders:[[id:1, amount:1000],[id:2, amount:3000]],[totalAmount:4000] ]

    abcSalesPersonOrdersList = [[name:'ABC'], orders:[[id:3, amount:1000]],[totalAmount:1000] ]

如何做到这一点。

【问题讨论】:

    标签: java list grails collections groovy


    【解决方案1】:

    使用groupBy 按名称对项目进行分组:

    def ordersList=[[id:1, amount:1000, salesPerson:'XYZ'], 
                [id:2, amount:3000, salesPerson:'XYZ'], 
                [id:3, amount:1000, salesPerson:'ABC']
               ];
    
    ordersList.groupBy{it.salesPerson} 
    //------------------------------------------------
    //Result: [XYZ:[[id:1, amount:1000, salesPerson:XYZ], [id:2, amount:3000, salesPerson:XYZ]], ABC:[[id:3, amount:1000, salesPerson:ABC]]]
    

    然后您可以转换地图以满足您的需求,例如:

    ordersList.groupBy{it.salesPerson}.collect{[name : it.key,orders : it.value]}
    //-----------------------------------------------
    //Result: [[name:XYZ, orders:[[id:1, amount:1000, salesPerson:XYZ], [id:2, amount:3000, salesPerson:XYZ]]], [name:ABC, orders:[[id:3, amount:1000, salesPerson:ABC]]]]
    

    【讨论】:

      猜你喜欢
      • 2015-07-26
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      相关资源
      最近更新 更多