- 项目中有统计的需求,一开始想使用pojo来封装统计的数据但是发现每个统计需求是特有的,也就是说写pojo是可以解决问题的,但是只是用一次统计就不用了,而且后期统计需求增加,pojo会大量增加,所以就思考是否有更好的解决方案
思路:前后端交互用的是json数据,json的结构抽象出来就是一棵树或多棵树,所以生成统计数据实际就是生成一棵树,生成一棵树实际就是对节点的操作(CRUD),所以要统计数据就是要自定义一棵可以过滤的树,当一个统计数据(如:性别)流经这棵树时,首先会根据给定的筛选节点进行流动,遇到分支会进行判断,流向特定的分支,如发现判断后没有给定节点,将会生成新的节点,最后将统计结果放在树的分支的最后一个节点上,从而实现了相对自由的统计结构生成方式
环境:springboot
依赖:net.sf.json.JSONObject(用其它也是可以的,思路一样方法不一样而已)
import net.sf.json.JSONObject;
import java.util.*;
/**
* @author ZC
* @date 2019/12/23
*/
public class Test {
public static void main(String[] args) {
//模拟数据
List<User> userList = new ArrayList<>();
userList.add(new User(1, "1997", "IT部"));
userList.add(new User(0, "1992", "销售部"));
userList.add(new User(0, "1999", "IT部"));
userList.add(new User(1, "1995", "IT部"));
userList.add(new User(0, "1995", "销售部"));
userList.add(new User(1, "1997", "IT部"));
userList.add(new User(0, "1995", "运维部"));
userList.add(new User(1, "1997", "IT部"));
userList.add(new User(0, "1997", "运维部"));
userList.add(new User(1, "1995", "IT部"));
userList.add(new User(0, "1997", "运维部"));
userList.add(new User(1, "1992", "运维部"));
userList.add(new User(1, "1992", "IT部"));
//统计数据的根节点
JSONObject statistics = new JSONObject();
//过滤的一些条件和统计数据
HashMap<String, Object> condittion = new HashMap<>();
//设置根条件(属于哪个公司)
condittion.put("com", "哈皮公司");
//统计
for (User user : userList) {
//设置子条件和统计数据
condittion.put("gender", user.getSex());
condittion.put("dep", user.getDep());
condittion.put("year", user.getBirthday());
//开始统计过滤
jsonDepInc(statistics, condittion);
}
System.out.println(statistics);
}