在groovy中构建频率计数图。

时间:2012-11-04 00:53:06

标签: groovy

我有一个数组,我想构建一个地图,记录数组中元素的频率。因此,对于下面的示例,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
    }

2 个答案:

答案 0 :(得分:13)

在Groovy 1.8或更高版本中,

assert [15, 16, 15].countBy { it } == [15: 2, 16: 1]

答案 1 :(得分:1)

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

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. 地图需要在大括号之间用冒号启动,正如比尔詹姆斯在评论中所说的那样。
  2. 无法在arraylist
  3. 上使用each的双参数版本
  4. 后缀增量不会导致保存增量值;此外,显式putAt调用很好,但它提供了更具表现力的重载[key] = val语法。
  5. 所有这一切,我假设这是一个学习常规的编码练习。 doelleri的答案更简洁,并使用所提供的工具,所以在现实世界中,我会选择它。