我有一个数组,我想构建一个地图,记录数组中元素的频率。因此,对于下面的示例,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
}
答案 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
}
这解决了一些问题:
each
的双参数版本
putAt
调用很好,但它提供了更具表现力的重载[key] = val
语法。所有这一切,我假设这是一个学习常规的编码练习。 doelleri的答案更简洁,并使用所提供的工具,所以在现实世界中,我会选择它。