解决统计出现次数问题的方法类

353 阅读2分钟

本人在测试抽奖活动的过程中,遇到一个需求,需要统计每一次抽奖结果,然后跟预期值比较。一开始的思路是没遇到一次然后设立一个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 值,使用还需要分情况,可以重载一下。

往期文章精选

  1. java一行代码打印心形
  2. Linux性能监控软件netdata中文汉化版
  3. 接口测试代码覆盖率(jacoco)方案分享
  4. 性能测试框架
  5. 如何在Linux命令行界面愉快进行性能测试
  6. 图解HTTP脑图
  7. 写给所有人的编程思维
  8. 将json数据格式化输出到控制台
  9. 如何测试概率型业务接口
  10. 将swagger文档自动变成测试代码
  11. Mac+httpclient高并发配置实例
  12. httpclient处理多用户同时在线

公众号地图 ☢️ 一起来~FunTester