加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何使用groovy对列表进行分组

发布时间:2020-12-14 16:27:06 所属栏目:大数据 来源:网络整理
导读:我有一个列表,我想按市场名称和商品名称分组,按列出价格: 例如[“Terra”,“Wheat”,1000.0] – “Terra”是市场名称,“Wheat”是商品名称,1000.0是价格 def marketCommodityGroup = [ ["Merkato","Wheat",1000.0],["Shola",1875.0],["Merkato","Barley",50
我有一个列表,我想按市场名称和商品名称分组,按列出价格:
例如[“Terra”,“Wheat”,1000.0] – “Terra”是市场名称,“Wheat”是商品名称,1000.0是价格

def marketCommodityGroup = [
                              ["Merkato","Wheat",1000.0],["Shola",1875.0],["Merkato","Barley",5000.0],1500.0] 
                           ]

我希望输出为:

[
   ["Merkato": ["Wheat" : [1000.0,1000.0,1500.0]]],["Merkato": ["Barley": [5000.0]]],["Shola": ["Wheat": [1875.0]]]
]

解决方法

好吧,这是一种做法.

def mapped = marketCommodityGroup.groupBy {
  [(it[0]) : it[1]]
}.collect { k,v ->
  def grouping = k.find { true }
  def prices = v.inject([]) { acc,val -> acc + val[2] }
  [ (grouping.key),[ (grouping.value) : prices ] ]
}.sort { left,right ->
  right[0] <=> left[0]
}.collect {
  [(it[0]) : it[1] ]
}

> first groupBy正是你所说的,它按市场名称和商品名称分组
> collect创建所需结构,不包括最终的k:v关联:

>分组是键映射拆分中的唯一条目,以便可以将其重新排序为所需的形式
>价格是通过非常方便的注入完成的,这是Groovy相当于功能语言中的折叠左操作

> sort用于按指定方式翻转顺序 – 必须询问实际逻辑是什么,以便您可能想要替换它
>最后一次收集做最后的地图分配,以获得确切的通缉表格

是的,它有点密集和神奇,但你总是可以用正确的描述性名称将闭包移动到defs.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读