当前位置: 首页 > article >正文

List<Map<String, Object>>汇总统计排序

开发环境:jdk 1.8

需求一:
1、统计每个小时(升序)不同事件的产品产量
2、统计不同事件(OK 、NG)的总产量

public static void main(String[] args) {
		
    	//数据源
        List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
        Map<String, Object> map1 = new HashMap<String, Object>();
        map1.put("hour", "10");//小时
        map1.put("event", "OK");//事件
        map1.put("number", 12);//产量
        list.add(map1);
        
        Map<String, Object> map2 = new HashMap<String, Object>();
        map2.put("hour", "08");
        map2.put("event", "NG");
        map2.put("number", 10);
        list.add(map2);
        
        Map<String, Object> map3 = new HashMap<String, Object>();
        map3.put("hour", "09");
        map3.put("event", "NG");
        map3.put("number", 7);
        list.add(map3);
        
        Map<String, Object> map4 = new HashMap<String, Object>();
        map4.put("hour", "08");
        map4.put("event", "OK");
        map4.put("number", 30);
        list.add(map4);
        
        System.out.println(list);
        System.out.println("--------------------------");
        
        // 进行分组和汇总 并 按hour字段的升序排序
        // 按小时统计每个小时的事件和数量
        Map<String, Map<String, Integer>> hourEventNumberSum = list.stream()
            .collect(Collectors.groupingBy(
                item -> (String) item.get("hour"),
                TreeMap::new, // 使用 TreeMap 以保证 hour 字段升序
                Collectors.groupingBy(
                    item -> (String) item.get("event"),
                    Collectors.summingInt(item -> (Integer) item.get("number"))
                )
            ));

        // 打印结果
        // 这里如果直接定义int变量累加计算总和,会报错:Local variable count defined in an enclosing scope must be final or effectively final,增强for里面用外部变量需要final,但这里在做累加计算,无法使用final修饰,所以改用了List<Integer>计算总和
        //计算OK总和用的集合
		List<Integer> listOk = new ArrayList<Integer>();
		//计算NG总和用的集合
		List<Integer> listNg = new ArrayList<Integer>();
        hourEventNumberSum.forEach((hour, eventMap) -> {
            System.out.println("Hour: " + hour);
            eventMap.forEach((event, number) -> {
                System.out.println("  Event: " + event + ", Number: " + number);
                if ("OK".equals(event.toUpperCase())) {
					listOk.add(number);
				}else if ("NG".equals(event.toUpperCase())) {
					listNg.add(number);
				}
            });
        });
    	
        System.out.println("--------------------------");
        
        //计算OK总和
        int sumOk = listOk.stream()
                .mapToInt(Integer::intValue) // 转换成 IntStream
                .sum(); // 计算和
        
        System.out.println("OK Sum of elements: " + sumOk);
        
        //计算NG总和
        int sumNg = listNg.stream()
                .mapToInt(Integer::intValue) // 转换成 IntStream
                .sum(); // 计算和

        System.out.println("NG Sum of elements: " + sumNg); 
        
	}

执行结果
在这里插入图片描述
需求二:
统计每个小时(倒序)不同事件的产品产量

public static void main29(String[] args) {
    	
    	//数据源
        List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
        Map<String, Object> map1 = new HashMap<String, Object>();
        map1.put("hour", "10");
        map1.put("event", "B");
        map1.put("number", 12);
        list.add(map1);
        
        Map<String, Object> map2 = new HashMap<String, Object>();
        map2.put("hour", "08");
        map2.put("event", "A");
        map2.put("number", 10);
        list.add(map2);
        
        Map<String, Object> map3 = new HashMap<String, Object>();
        map3.put("hour", "09");
        map3.put("event", "A");
        map3.put("number", 7);
        list.add(map3);
        
        Map<String, Object> map4 = new HashMap<String, Object>();
        map4.put("hour", "08");
        map4.put("event", "B");
        map4.put("number", 30);
        list.add(map4);
    	
		System.out.println(list);
        System.out.println("--------------------------");
        
    	// 进行分组和汇总
        Map<String, Map<String, Integer>> hourEventNumberSum = list.stream()
            .collect(Collectors.groupingBy(
                item -> (String) item.get("hour"),
                TreeMap::new, // 使用 TreeMap 以保证按 hour 字段升序
                Collectors.groupingBy(
                    item -> (String) item.get("event"),
                    Collectors.summingInt(item -> (Integer) item.get("number"))
                )
            ));

        // 将 TreeMap 转换为倒序的 LinkedHashMap
        Map<String, Map<String, Integer>> sortedHourEventNumberSum = hourEventNumberSum.entrySet()
            .stream()
            .sorted(Map.Entry.<String, Map<String, Integer>>comparingByKey(Comparator.reverseOrder()))
            .collect(Collectors.toMap(
                Map.Entry::getKey,
                Map.Entry::getValue,
                (e1, e2) -> e1,
                LinkedHashMap::new
            ));
        
        // 打印结果
        sortedHourEventNumberSum.forEach((hour, eventMap) -> {
            System.out.println("Hour: " + hour);
            eventMap.forEach((event, number) -> {
                System.out.println("  Event: " + event + ", Number: " + number);
            });
        });
	}

在这里插入图片描述


http://www.kler.cn/a/300700.html

相关文章:

  • Navicat 17 功能简介 | 商业智能 BI
  • ASP.NET Core - 配置系统之配置添加
  • 云消息队列 Kafka 版 V3 系列荣获信通院“云原生技术创新标杆案例”
  • 2025.1.16——三、supersqli 绕过|堆叠注入|handler查询法|预编译绕过法|修改原查询法
  • Digital Document System (DDS)
  • PyTorch使用教程(2)-torch包
  • paddle模型转onnx介绍(以utc-mini为例)
  • shell脚本编程-进阶部分
  • 作为负责招聘的HR,如何解决职位吸引力不足的问题
  • 【STM32】OLED
  • 部署后端WebSocket服务到AWS云服务器
  • C++与QML的数据交互
  • 数字证书学习
  • MySQL——DCL
  • C#的属性和方法
  • opencv羊群计数,动态目标检测跟踪
  • List集合特点,遍历方式,ArrayList(去重原理,增长因子论,LinkedList)
  • 【Kubernetes】常见面试题汇总(十一)
  • milvus的二进制文件集群部署
  • 区块链当前发展和未来展望
  • 【微服务】⭐️华为云obs功能抽取到公共服务,供所有项目使用
  • 【机器学习】马尔可夫随机场的基本概念、和贝叶斯网络的联系与对比以及在python中的实例
  • JS设计模式之装饰者模式:优雅的给对象增添“魔法”
  • 健身房|基于springboot的健身房管理系统设计与实现(附项目源码+论文+数据库)
  • Python数据分析与可视化
  • leetcode hot100_part01_哈希