代码之家  ›  专栏  ›  技术社区  ›  snbmt21

如何在Groovy中使用CollectEntries来创建每个键都有多个值的映射

  •  0
  • snbmt21  · 技术社区  · 2 年前

    我有以下清单。其格式为[String,Double]

    def data = [ ['A', 15.2], ['A', 14.7], ['B', 6.54], ['A', 4.5], ['A', 16.8], ['A', 7.7], ['C', 1.5], ['B', 13.1], ['B', 6], ['C', 10.1] ]
    

    我想要一个映射,其中我将每个扇区(字符串)分组为具有多个相关温度(双)的键

    我已经能够通过使用.each迭代数据来获得所需的输出

    Map<String, List<BigDecimal>> groupedData = new HashMap<>()
    data.each {it ->
        String sector = it[0]
        BigDecimal temp = it[1]
    
        if(!groupedData.containsKey(sector))
        {
            groupedData.put(sector, [])
        }
        groupedData.get(sector).add(temp)
    
    }
    

    我是groovy的新手,一直在试图弄清楚是否可以只使用collectentries获得相同的输出。我知道groovy不需要显式的变量声明,但请在你的解释中包括它们,这样我就可以完全理解代码中发生了什么

    1 回复  |  直到 2 年前
        1
  •  1
  •   daggett    2 年前

    2个选项。两者给出相同的结果

    def data = [ ['A', 15.2], ['A', 14.7], ['B', 6.54], ['A', 4.5], ['A', 16.8], 
                 ['A', 7.7], ['C', 1.5], ['B', 13.1], ['B', 6], ['C', 10.1] ]
    
    println data.groupBy{it[0]}.collectEntries{k,v-> [ k,v.collect{it[1]} ]}
    println data.groupBy{it[0]}.collectEntries{k,v-> [ k,v*.get(1)] }