我来自 PHP 世界,我需要做一些记录统计。在 php 中我知道这很简单,但我如何在 Groovy 中执行以下操作
$logs = array( array( 'date' => '5-15', 'name' => 'foo' ...other stuff),
array( 'date' => '5-15', 'name' => 'bar' ...other stuff),
array( 'date' => '5-16', 'name' => 'foo' ...other stuff),
array( 'date' => '5-17', 'name' => 'foo' ...other stuff),
array( 'date' => '5-17', 'name' => 'foo' ...other stuff),
array( 'date' => '5-17', 'name' => 'bar' ...other stuff),
array( 'date' => '5-17', 'name' => 'bar' ...other stuff) );
$counts = array();
foreach($logs as $log) {
if( isset($counts[ $log['date'] ][ $log['name'] ]) ) {
$counts[ $log['date'] ][ $log['name'] ] = 1;
} else {
$counts[ $log['date'] ][ $log['name'] ]++;
}
}
这给了我结果
['5-15']['foo'] = 1
['5-15']['bar'] = 1
['5-16']['foo'] = 1
['5-17']['foo'] = 2
['5-17']['bar'] = 2
Logs 实际上是我从 GORM 查询返回的结果集。
最佳答案
您可以使用 Groovy countBy .
def map = logs.countBy{[it.date, it.name]}
您最终会得到一张结果图和相应的计数。在你的情况下它会像
[[5-15, foo]:1, [5-15, bar]:1, [5-16, foo]:1, [5-17, foo]:2, [5-17, bar]:2]
示例
def logs = [
[ date: '5-15', name: 'foo'],
[ date: '5-15', name: 'bar'],
[ date: '5-16', name: 'foo'],
[ date: '5-17', name: 'foo'],
[ date: '5-17', name: 'foo'],
[ date: '5-17', name: 'bar'],
[ date: '5-17', name: 'bar']]
def map = logs.countBy{[it.date, it.name]}
assert map[['5-15', 'foo']] == 1
assert map[['5-15', 'bar']] == 1
assert map[['5-16', 'foo']] == 1
assert map[['5-17', 'foo']] == 2
assert map[['5-17', 'bar']] == 2
如果你需要得到each
的 <key,value>
从 map 上看。你完全可以这样做:-
map.each{k, v ->
println "$k has been used $v times"
}
//Prints:
[5-15, foo] has been used 1 times
[5-15, bar] has been used 1 times
[5-16, foo] has been used 1 times
[5-17, foo] has been used 2 times
[5-17, bar] has been used 2 times
在 Groovy 2.1.3 中测试
关于groovy - php 类似于 Groovy 中的关联数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16864722/