本人在测试抽奖活动的过程中,遇到一个需求,需要统计每一次抽奖结果,然后跟预期值比较。一开始的思路是没遇到一次然后设立一个int 类型的参数,然后遇到了就++一次就行了,但是情况比较多,用 switch-case 来做比较麻烦,需要写很长的代码,联想到之前面试也遇到过类似的问题,所以特意写了一个方法来做这个事情。思路是利用 jsonobject 类的 containKey 方法来实现的。如果存在就 value 值加一,如果不存在就 put 到 jsonobject 里面。下面是代码,供各位参考。

package com.fun.utils

import com.fun.frame.SourceCode
import net.sf.json.JSONObject

import java.util.stream.Collectors

/**
* 统计出现次数相关类
*/
class CountTool extends SourceCode {
/**
* 统计数据出现的次数
*
* @param counts 统计的 jsonobject 对象
* @param object 需要统计的数据
*/
static def count(JSONObject counts, Object object) {
count(counts, object, 1)
}

/**
* 统计数据出现的次数
*
* @param counts 统计的 jsonobject 对象
* @param object 需要统计的数据
* @param num 默认值
*/
static def count(JSONObject counts, Object object, int num) {
counts.put(object, Integer.valueOf(counts.getOrDefault(object.toString(), num)))
}

/**
* 统计某个list里面某个元素出现的次数
* @param list
* @param str
* @return
*/
static def count(List list, def str) {
list.count { s -> s.toString().equals(str.toString()) }
}

/**
* 统计某个list里面各个元素出现的次数
* collect,是一个map<object,list>对象
* @param list
* @return
*/
static def count(List list) {
def collect = list.stream().collect(Collectors.groupingBy { x -> x.toString() })
collect.keySet().stream().sorted().forEach { x ->
output("元素:${x},次数:${collect.get(x).size()}")
}
}
}

中间用到了 tostring 方法,也就是只能针对基础变量类型和 string,其他的 tostring 出来可能是 hash 值,使用还需要分情况,可以重载一下。