首页 > 数据库 > 数据库开发技术 > 解决统计出现次数问题的方法类
本人在测试抽奖活动的过程中,遇到一个需求,需要统计每一次抽奖结果,然后跟预期值比较。一开始的思路是没遇到一次然后设立一个int 类型的参数,然后遇到了就++一次就行了,但是情况比较多,用 switch-case 来做比较麻烦,需要写很长的代码,联想到之前面试也遇到过类似的问题,所以特意写了一个方法来做这个事情。思路是利用 jsonobject 类的 containKey 方法来实现的。如果存在就 value 值加一,如果不存在就 put 到 jsonobject 里面。下面是代码,供各位参考。
1package com.fun.utils
2
3import com.fun.frame.SourceCode
4import net.sf.json.JSONObject
5
6import java.util.stream.Collectors
7
8/**
9 * 统计出现次数相关类
10 */
11class CountTool extends SourceCode {
12 /**
13 * 统计数据出现的次数
14 *
15 * @param counts 统计的 jsonobject 对象
16 * @param object 需要统计的数据
17 */
18 static def count(JSONObject counts, Object object) {
19 count(counts, object, 1)
20 }
21
22 /**
23 * 统计数据出现的次数
24 *
25 * @param counts 统计的 jsonobject 对象
26 * @param object 需要统计的数据
27 * @param num 默认值
28 */
29 static def count(JSONObject counts, Object object, int num) {
30 counts.put(object, Integer.valueOf(counts.getOrDefault(object.toString(), num)))
31 }
32
33/**
34 * 统计某个list里面某个元素出现的次数
35 * @param list
36 * @param str
37 * @return
38 */
39 static def count(List list, def str) {
40 list.count { s -> s.toString().equals(str.toString()) }
41 }
42
43/**
44 * 统计某个list里面各个元素出现的次数
45 * collect,是一个map<object,list>对象
46 * @param list
47 * @return
48 */
49 static def count(List list) {
50 def collect = list.stream().collect(Collectors.groupingBy { x -> x.toString() })
51 collect.keySet().stream().sorted().forEach { x ->
52 output("元素:${x},次数:${collect.get(x).size()}")
53 }
54 }
55}
中间用到了 tostring 方法,也就是只能针对基础变量类型和 string,其他的 tostring 出来可能是 hash 值,使用还需要分情况,可以重载一下。
原文作者:FunTester;如有侵权,请联系管理员删除。