3

我有一个数组,我想用它构建一个地图,记录数组中元素的频率。因此,对于下面的示例, map = [15:2, 16:1] 就是它的样子。我如何在 Groovy 中做到这一点?

static void doSomething()
    {
        def a = [15,16,15]
        def map = []
        a.each{
            k,v-> 
            if(map.contains(it)) 
            map.putAt k, v++
            else
            map.putAt k, 1;
        }

        println map
    }
4

2 回答 2

14

在 Groovy 1.8 或更高版本中,

assert [15, 16, 15].countBy { it } == [15: 2, 16: 1]
于 2012-11-04T01:42:21.430 回答
3

您可以将代码修改为以下内容:

void doSomething() {
        def a = [15,16,15]
        def map = [:]  //1
        a.each {  //2
            if(map.containsKey(it)) map[it] = map[it] + 1  //3
            else map[it] = 1;
        }

        println map
}

这解决了一些问题:

  1. map 需要在大括号之间用冒号开头,正如 Bill James 在评论中所指出的那样。
  2. 不能each在 arraylist 上使用 2 参数版本
  3. 后缀增量不会导致增量值被保存;此外,显式putAt调用很好,但它提供了[key] = val更具表现力的重载语法。

综上所述,我假设这是一个学习 groovy 的编码练习。doelleri 的答案更简洁,并使用提供的工具,所以在现实世界的情况下,我会这样做。

于 2012-11-04T20:32:53.287 回答