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.mfbz.cn/a/879316.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

根据 IP 地址进行 VPN 分流(详细,亲测,通用)

根据 IP 地址进行 VPN 分流&#xff08;详细&#xff0c;亲测&#xff0c;通用&#xff09; 背景 不在学校的时候需要使用实验室的服务器&#xff0c;但是实验室的服务器只能在校园网内访问&#xff0c;因此在校外就需要使用学校的 VPN&#xff0c;但是打开 VPN 以后会默认将…

js 3个事件监听器 EventListeners

起因&#xff0c; 目的: 我有2个显示器。 某视频网站&#xff0c;我想一边播放视频&#xff0c;一边搞其他。但是&#xff0c;当我把鼠标移动到浏览器外面&#xff0c;点击一下别处&#xff0c; 视频就会自动暂停. 这个叫做 事件监听&#xff01; blur, 在元素或窗口失去焦点…

JSON对接发送短信验证码怎么获取状态报告

现在很多网站的用户注册都会加一个短信验证功能&#xff0c;也就是需要用户填写手机号&#xff0c;然后点击“获取短信验证码”&#xff0c;将收到的短信验证码输入验证通过后方能进行下一步完成注册&#xff0c;现在短信验证码被广泛应用于网站用户注册&#xff0c;还被广泛应…

linux 安装histomicstk

一直安装失败&#xff0c;源码编译也未成功 最后使用这个成功了 pip install histomicstk --find-links https://girder.github.io/large_image_wheels

零基础如何学会Appium自动化测试?

前言 appium是一款移动自动化测试工具&#xff0c;经常被用于实现UI自动化测试&#xff0c;其可支持安卓和IOS两大平台&#xff0c;还支持多种编程&#xff0c;因而得到了广泛的应用。此处便是立足于安卓平台&#xff0c;借助appium工具&#xff0c;使用python语言实现简单的自…

王者荣耀改重复名(java源码)

王者荣耀改重复名 项目简介 “王者荣耀改重复名”是一个基于 Spring Boot 的应用程序&#xff0c;用于生成王者荣耀游戏中的唯一名称。通过简单的接口和前端页面&#xff0c;用户可以输入旧名称并获得一个新的、不重复的名称。 功能特点 生成新名称&#xff1a;提供一个接口…

[mysql]mysql排序和分页

#排序和分页本身是两块内容,因为都比较简单,我们就把它分到通一个内容里. #1排序: SELECT * FROM employees #我们会发现,我们没有做排序操作,但是最后出来的107条结果还是会按顺序发出,而且是每次都一样.这我们就有一个疑惑了,现在我们的数据库是根据什么来排序的,在我们没有进…

【机器学习】--- 自然语言推理(NLI)

引言 随着自然语言处理&#xff08;NLP&#xff09;的迅速发展&#xff0c;**自然语言推理&#xff08;Natural Language Inference, NLI&#xff09;**已成为一项重要的研究任务。它的目标是判断两个文本片段之间的逻辑关系。这一任务广泛应用于机器阅读理解、问答系统、对话…

二叉搜索树(Java实现)

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多数据结构知识 目录 1.概念 2.实现二叉搜索树 定义节点 查找元素 插入元素 删除元素 1.概念 二叉搜索树又称二叉排序树,或者它是一棵空树,或者是具有…

数字IC设计\FPGA 职位经典笔试面试整理--语法篇 Verilog System Verilog(部分)

注&#xff1a; 资料都是基于网上一些博客分享和自己学习整理而成的 Verilog 1. 数据类型 Verilog一共有19种数据类型 基础四种数据类型&#xff1a;reg型&#xff0c;wire型&#xff0c;integer型&#xff0c;parameter型 reg型   reg类型是寄存器数据类型的关键字。寄存…

镀金引线---

一、沉金和镀金 沉金和镀金都是常见的PCB金手指处理方式&#xff0c;它们各有优劣势&#xff0c;选择哪种方式取决于具体的应用需求和预算。 沉金&#xff08;ENIG&#xff09;是一种常用的金手指处理方式&#xff0c;它通过在金手指表面沉积一层金层来提高接触性能和耐腐蚀性…

【C++】模拟实现vector

在上篇中我们已经了解过的vector各种接口的功能使用&#xff0c;接下来我们就试着模拟实现一下吧&#xff01; 注意&#xff1a;我们在此实现的和C标准库中实现的有所不同&#xff0c;其目的主要是帮助大家大概理解底层原理。 我们模拟vector容器的大致框架是&#xff1a; t…

[SIGGRAPH-24] CharacterGen

[pdf | code | proj] LRM能否用于3D数字人重建&#xff1f;问题在于&#xff1a;1&#xff09;缺少3D数字人数据&#xff1b;2&#xff09;重建任意姿态的3D数字人不利于后续绑定和驱动。构建3D数字人数据集&#xff1a;在VRoidHub上采集数据&#xff0c;得到13746个风格化角色…

图片编辑软件,这4款免费又好用!

在这个视觉为王的时代&#xff0c;一张精心编辑的图片往往能瞬间吸引眼球&#xff0c;无论是社交媒体分享、博客配图还是商业宣传&#xff0c;都离不开强大的图片编辑工具。但高昂的软件费用常常让人望而却步。别担心&#xff0c;今天我们就来揭秘4款不仅免费还超级好用的图片编…

OpenAI 刚刚推出 o1 大模型!!突破LLM极限

北京时间 9 月 13 日午夜&#xff0c;OpenAI 正式发布了一系列全新的 AI 大模型&#xff0c;专门用于应对复杂问题。 这一新模型的出现代表了一个重要突破&#xff0c;其具备的复杂推理能力远远超过了以往用于科学、代码和数学等领域的通用模型&#xff0c;能够解决比之前更难的…

在线IP代理检测:保护您的网络安全

在互联网飞速发展的今天&#xff0c;越来越多的人开始意识到网络安全和隐私保护的重要性。在线IP代理检测工具作为一种有效的网络安全手段&#xff0c;能够帮助用户识别和检测IP代理的使用情况&#xff0c;从而更好地保护个人隐私和数据安全。本文将详细介绍在线IP代理检测的相…

​‌Macbook如何玩《黑神话:悟空》‌2024最新详细方法

‌Mac用户可以通过几种方法玩《黑神话&#xff1a;悟空》‌。 ‌使用虚拟机‌&#xff1a;通过Parallels Desktop等虚拟机软件&#xff0c;在Mac上运行Windows系统&#xff0c;并在其中安装和运行《黑神话悟空》。这种方法需要Mac电脑满足游戏的基础配置要求。 不过如果电脑有虚…

AI逻辑推理入门

参考数据鲸 (linklearner.com) 1. 跑通baseline 报名 申领大模型API 模型服务灵积-API-KEY管理 (aliyun.com) 跑通代码 在anaconda新建名为“LLM”的环境,并安装好相应包后,在jupyter notebook上运行baseline01.ipynb 2. 赛题解读 一般情况下,拿到一个赛题之后,我们需…

LeetCode-137. 只出现一次的数字 II【位运算 数组】

LeetCode-137. 只出现一次的数字 II【位运算 数组】 题目描述&#xff1a;解题思路一&#xff1a;解题思路二&#xff1a;符号位一起判断。背诵版解题思路三&#xff1a;0 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每…

Fiddler抓包工具实战

文章目录 &#x1f7e2; Fiddler入门到精通&#x1f449;主要功能&#x1f449;使用场景 &#x1f7e2; 一、Fiddler抓包和F12抓包对比&#x1f7e2; 二、Fiddler的核心功能&#x1f7e2; 三、Fiddler的工作原理&#x1f7e2; 四、Fiddler功能配置使用&#x1f449;规则设置&am…