处理对象集合,输出Map<String, Map<String, List<MyObject>>>格式数据,无序组合键处理方法
需求:对象有字段A,B,C,需要判断对象之间AB两个字段相同的对象
如:
对象1,A=aaa,B=bbb
对象2,A=aaa,B=bbb
对象3,A=bbb,B=aaa
对象4,A=bbb,B=aaa
那这四个对象都是属于相同对象,先根据C字段分组,再去判断组内数据AB字段,输出以C为分组的map,key为c的内容,value是一个map的list集合,里面的map的key是AB字段组合的无序组合键,value是相同无序组合键的对象集合
package com.b2bwings.cc.core;import lombok.Getter;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.junit.jupiter.api.Test;public class TestClass {class MyObject {@Getterprivate String a;@Getterprivate String b;@Getterprivate String c;public MyObject(String a, String b, String c) {this.a = a;this.b = b;this.c = c;}}// 生成AB字段的无序组合键(如A=aaa,B=bbb和A=bbb,B=aaa生成相同键)private String createCompositeKey(String a, String b) {String[] arr = {a, b};Arrays.sort(arr);return arr[0] + "|" + arr[1];}@Testvoid test() {// 实际数据源)List<MyObject> dataList = new ArrayList<>();dataList.add(new MyObject("aaa", "bbb","1"));dataList.add(new MyObject("bbb", "aaa","1"));dataList.add(new MyObject("bbb", "aaa","1"));dataList.add(new MyObject("ccc", "bbb","1"));dataList.add(new MyObject("bbb", "ccc","1"));dataList.add(new MyObject("bbb", "ccc","1"));dataList.add(new MyObject("aaa", "bbb","2"));dataList.add(new MyObject("aaa", "bbb","2"));dataList.add(new MyObject("bbb", "aaa","2"));dataList.add(new MyObject("bbb", "aaa","2"));dataList.add(new MyObject("aaa", "bbb","3"));dataList.add(new MyObject("aaa", "bbb","3"));dataList.add(new MyObject("bbb", "aaa","3"));dataList.add(new MyObject("bbb", "aaa","3"));dataList.add(new MyObject("aaa", "bbb","3"));dataList.add(new MyObject("aaa", "bbb","3"));dataList.add(new MyObject("bbb", "aaa","3"));dataList.add(new MyObject("bbb", "aaa","3"));Map<String, Map<String, List<MyObject>>> result = dataList.stream().collect(Collectors.groupingBy(MyObject::getC)).entrySet().parallelStream().collect(Collectors.toMap(entry -> entry.getKey().toString(), // 关键修改点:Lambda替代方法引用cEntry -> {// 二级分组:按AB无序组合键return cEntry.getValue().stream().collect(Collectors.groupingBy(obj -> createCompositeKey(obj.getA(), obj.getB())));}));result.forEach((k, v) -> {System.out.println(k + ":" + v.size());});}}
输出结果:
无序组合键的详细说明
基本定义
无序组合键是指由多个元素(如字段、按键、符号等)组成的标识符,其唯一性由元素的内容决定,而非元素的顺序。这意味着,无论元素的排列顺序如何变化,只要内容相同,组合键的标识作用一致。这一概念广泛应用于数据分组、密码学、快捷键设计等领域。
数学基础:
在组合数学中,无序组合的计算公式为 C(n,m)=m!(n−m)!n!,其中 n 为元素总数,m 为选取的元素个数(例如从4个元素中选2个,共有6种无序组合)
常见应用场景
(1)数据分组与去重
- 数据库/编程中的字段组合:
若需根据字段A和B对数据进行分组(例如统计用户行为),但字段顺序不影响分组结果(如A=1、B=2与A=2、B=1视为同一组),可通过以下方式实现:- 排序生成唯一键:将字段值排序后拼接(例如将A和B按升序排列生成键
1|2
),确保顺序无关 - 集合类型存储:使用无序集合(如Java的
HashSet
)自动处理顺序问题
- 排序生成唯一键:将字段值排序后拼接(例如将A和B按升序排列生成键
(2)键盘快捷键设计
- 组合键的无序触发:
某些软件允许用户自定义组合键(如Ctrl+Shift+S与Shift+Ctrl+S触发同一功能),通过检测修饰键(Ctrl、Shift等)是否被按下,而非顺序- 实现方式:在事件处理中,通过位运算检查修饰键状态,而非依赖按键顺序
(3)密码学与哈希算法
- 基于无序组合的密钥生成:
在加密算法中,若密钥由多个字符组成,其排列顺序不影响最终加密结果(需特殊设计),可提升密钥的灵活性和抗暴力破解能力。
// 生成无序组合键(A、B字段顺序无关)
public String generateCompositeKey(String a, String b) {String[] values = {a, b};Arrays.sort(values); // 排序保证顺序无关return values[0] + "|" + values[1]; // 分隔符防止哈希冲突
}// 使用示例:将对象按A、B字段分组
Map<String, List<MyObject>> groupedObjects = objectList.stream().collect(Collectors.groupingBy(obj -> generateCompositeKey(obj.getA(), obj.getB())));
相关文章:
处理对象集合,输出Map<String, Map<String, List<MyObject>>>格式数据,无序组合键处理方法
需求:对象有字段A,B,C,需要判断对象之间AB两个字段相同的对象 如: 对象1,Aaaa,Bbbb 对象2,Aaaa,Bbbb 对象3,Abbb,Baaa 对象4,Abbb,Baaa…...
基于SpringBoot的食物营养分析与推荐网站系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
人智交互中的AI世代
人智交互中的AI世代 一、研究背景与意义 1.1 技术演进背景 人工智能技术自1956年达特茅斯会议提出概念以来,经历了多次技术迭代与产业周期。2020年后,以大语言模型(LLMs)和生成式AI(AIGC)为代表的突破性进…...
从Flask到智能体:装饰器模式在AI系统中的架构迁移实践
引言:框架设计中的模式复用 在人工智能系统开发领域,大型语言模型驱动的智能体(LLM Agent)正面临日益复杂的架构挑战。有趣的是,Web开发框架Flask的装饰器模式为此类系统的构建提供了极具启发性的解决方案。本文将深入…...
Docker的常用命令
docker的常用命令 今天来介绍docker的常用命令,非常的详细,请大家看起来! 获取镜像 如果只指定了镜像的名称,则默认会获取latest标签标记的镜像 命令格式:dokcer pull [Docker Registry地址]仓库名[:标签名] 获取c…...
在matlab中使用UAV123官方toolkits测试自己的数据集
一、前言 最近需要将自己的跟踪代码在自己拍摄的数据集上进行测试,这里我选择使用 UAV123 官方 toolkits 进行配置。首先需要搞清楚这部分代码是如何运行的,精度图和成功率图是如何绘制出来的,然后再将自己的数据集加进去进行测试。 二、UA…...
《淘宝 API 数据湖构建:实时商品详情入湖 + Apache Kafka 流式处理指南》
随着电商行业的蓬勃发展,淘宝作为头部电商平台,积累了海量的商品数据。构建淘宝 API 数据湖,将实时商品详情数据纳入其中,并借助 Apache Kafka 进行流式处理,能够为企业提供强大的数据支撑,助力精准营销、市…...
HTML5 WebSocket:实现高效实时通讯
一、引言 在当今的 Web 开发领域,实时通讯功能变得越来越重要。例如在线聊天、实时数据更新等场景都需要客户端与服务器之间能够进行高效的双向数据传输。HTML5 引入的 WebSocket 协议为我们提供了一种强大的解决方案,它在单个 TCP 连接上实现了全双工通讯,极大地改善了传统…...
数字人Live_Talking的搭建和使用
Live_Talking是一个实时交互流式数字人,可以实现音视频同步对话。今天咱们来试着部署一下项目。 先来看下本地环境 系统:Ubuntu 22.04 显卡:rtx 3060 cuda: Cuda 12.1 git上推荐cuda11.3,但是我用cuda12.2也搭建成功了。 1、…...
Coupang火箭计划深度攻略:eBay卖家突破韩国市场的三维数据作战模型
一、市场机遇与竞争格局解码 1.1 Coupang生态位分析 用户基数:2600万活跃买家(占韩国成年人口68%) 客单价表现:$82(较eBay韩国站高37%) 流量分布:移动端占比91%(需重点优化移动端详…...
Flask + ajax上传文件(四)--数据入库教程
本教程将详细介绍如何使用Flask后端和AJAX前端实现Excel/csv文件上传,并将数据导入数据库的功能。 一、系统架构概述 前端(HTML+JS) → AJAX请求 → Flask后端 → 数据库 二、环境准备 1. 安装必要库 pip install flask pandas sqlalchemy openpyxl2. 项目结构 data_imp…...
C++ 部署的性能优化方法
一、使用结构体提前存放常用变量 在编写前后处理函数时,通常会多次用到一些变量,比如模型输入 tensor 的 shape,count 等等,若在每个处理函数中都重复计算一次,会增加部署时的计算量。对于这种情况,可以考…...
并发设计模式实战系列(8):Active Object
🌟 大家好,我是摘星! 🌟 今天为大家带来的是并发设计模式实战系列,第8章Active Object,废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 对象与执行解耦架构 2. 核心组件 二、生活化类比ÿ…...
jenkins容器提示磁盘空间过低
进入jenkins容器查看: sudo docker exec -it jenkins sh df -h查看磁盘占用情况: # df -h Filesystem Size Used Avail Use% Mounted on overlay 59G 56G 193M 100% / tmpfs 64M 0 64M 0% /dev shm…...
记一次pdf转Word的技术经历
一、发现问题 前几天在打开一个pdf文件时,遇到了一些问题,在Win10下使用WPS PDF、万兴PDF、Adobe Acrobat、Chrome浏览器打开都是正常显示的;但是在macOS 10.13中使用系统自带的预览程序和Chrome浏览器(由于macOS版本比较老了&am…...
【3分钟准备前端面试】Hybrid开发 谷歌浏览器调试安卓app
查看数据请求,页面dom结构和样式,日志打印输出,页面缓存等浏览器控制台素有功能,方便调试 检查元素,方便bug的定位 注:该文档是谷歌浏览器调试安卓apk内嵌网页 前提 app包需要是debug包,并且app的webview开启debug模式需要翻墙安卓手机打开开发者模式,开启usb调试调试…...
【二分查找】寻找峰值(medium)
6. 寻找峰值(medium) 题⽬描述:解法⼆(⼆分查找算法):算法思路:C 算法代码:Java 算法代码: 题⽬链接:162. 寻找峰值 题⽬描述: 峰值元素是指其值…...
这是一款好用的PDF工具!
用户习惯有时确实非常顽固,想要改变它可能需要漫长的时间。 比如PDF软件,我认为国产的福/昕、万/兴等软件都非常不错,它们贴合国人的使用习惯,操作起来非常顺手。但因为我习惯使用DC,所以在处理PDF文档时,…...
征程 6 逆向自证 hbm 与 bc 一致性
1.引言 在征程 6 算法工具链使用过程中,会存在算法侧与软件侧的交接,偶尔会遇到,需要自证清白的情况,例如: 算法侧反馈:bc 精度没问题,也参考了【征程 6】bc 与 hbm 一致性比对 文章ÿ…...
推荐一个微软官方开源浏览器自动化工具,可以用于UI自动化测试、爬虫等,具备.Net、Java、Python等多个版本!
推荐一个微软官方开源,且功能非常强大的浏览器自动化工具, 让我们很容易控制Chromium、Firefox 和 WebKit 内核的浏览器,实现跨浏览器的网页自动化操作。 01 项目简介 Playwright 一个开源浏览器自动化工具。 支持 Chromium、WebKit 和 Fir…...
深入理解链表:从基础操作到高频面试题解析
目录 一、链表基础概念 1.1 什么是链表? 1.2 链表核心特性 1.3 链表与数组对比 二、链表类型详解 2.1 单向链表 2.2 双向链表 2.3 循环链表 三、链表核心操作实现 3.1 插入操作 3.2 删除操作 四、链表高频面试题精讲 4.1 反转链表(LeetCode…...
【MCP Node.js SDK 全栈进阶指南】高级篇(1):MCP多服务器协作架构
随着业务规模的不断扩大和系统复杂度的提升,单一服务器架构往往无法满足高并发、高可用性和弹性扩展的需求。在MCP生态系统中,多服务器协作架构成为构建大规模应用的必然选择。本文将深入探讨MCP TypeScript-SDK在多服务器环境下的部署、协作和管理,以及如何构建高可用、高性…...
铭记之日(3)——4.28
铭记之日(3)——4.28 25.4.28,绝对是继20.12.19与24.6.26之后,又一个被钉在耻辱柱上的日子。 4.28本质上为12.19的严重恶劣版。 道德败坏、恶劣的大骗子终于在今日穿帮落马。 斯文面孔下,竟藏匿了如此罪恶幽暗混沌的内心。 24.10.20&…...
4月28日信息差全景:国际局势、科技突破与市场震荡一、国际政治与安全:俄乌冲突关键转折
一、国际政治与安全:俄乌冲突关键转折 1. 乌克兰反攻进展与情报差异 前线动态: 俄国防部称在顿涅茨克击退乌军三次进攻,摧毁12辆坦克;乌方则宣布在巴赫穆特南部推进2公里,双方战报存在显著差异。 信息差根源:战场信息管控导致西方媒体与俄媒报道截然不同。 国际援助: 美…...
Docker 容器虚拟化技术和自动化部署
Docker 容器虚拟化技术和自动化部署 一、Docker 核心组件1.1 Docker 引擎1.2 Docker 镜像1.3 Docker 容器1.4 Docker 仓库 二、Docker 环境安装清华镜像安装 三、Docker 基本操作3.1 镜像管理3.1.1 查看本地镜像 docker images3.1.2 添加镜像标签 docker tag3.1.3 查看镜像信息…...
人物5_My roommate
こんにちは Today, I will continue to share my life in JaPan. Everyone both know I couldn’t say JanPanese fluently【But I still learn this Language, I think it’s interesting for me{maybe it’s one exciting challenge, I want become a challenger that it li…...
OpenResty技术深度解析:原理、应用与生态对比-优雅草卓伊凡
OpenResty技术深度解析:原理、应用与生态对比-优雅草卓伊凡 一、OpenResty技术概述 1.1 OpenResty是什么? OpenResty是一个基于Nginx的高性能Web平台,它将标准的Nginx核心与一系列强大的第三方模块(主要是LuaJIT)捆绑在一起,形成了一个全功能的Web应用服务器。不同于传…...
深度学习任务评估指标
一、概念篇 混淆矩阵有何作用? 混淆矩阵(Confusion Matrix)是用于评估分类模型性能的工具,它展示了模型预测结果与实际标签之间的对比。混淆矩阵通常包括四个关键元素: True Positive (TP):模型正确预测为正类的数量。True Negative (TN):模型正确预测为负类的数量。F…...
Python-librosa库提取音频数据的MFCC特征
文章目录 MFCC特征代码分享 MFCC特征 MFCC(Mel-Frequency Cepstral Coefficients)是通过人耳对声音频率的感知方式对音频信号进行处理得到的特征,广泛用于语音识别和音频处理。 代码分享 import os import librosa import pywt import matpl…...
因特网和万维网
本文来源 :腾讯元宝 因特网(Internet)和万维网(World Wide Web,简称WWW)是紧密相关但完全不同的两个概念,它们的核心区别如下: 本质不同 因特网(Internet&#…...
道可云人工智能每日资讯|“人工智能科技体验展”在中国科学技术馆举行
道可云元宇宙每日简报(2025年4月28日)讯,今日元宇宙新鲜事有: 《2025年提升全民数字素养与技能工作要点》发布 近日,中央网信办、教育部、工业和信息化部、人力资源社会保障部联合印发《2025年提升全民数字素养与技能…...
Day8 鼠标控制与32位模式切换
文章目录 1. 例程harib05a(鼠标解读1)2. 例程harib05b(代码整理)3. 例程harib05c(鼠标解读2)4. 例程harib05d(移动鼠标指针)5. 通往32位模式之路 1. 例程harib05a(鼠标解…...
塔能科技:点亮节能之光,赋能工厂与城市
在能源形势日益严峻的当下,节能成为了各行各业的关键任务。工厂作为能耗大户,降低能耗迫在眉睫;市政照明作为城市运行的基本保障,也急需向绿色节能转型。塔能科技凭借其能源精准节能和定制开发的核心能力,为工厂节能和…...
UDP 报文结构与注意事项总结
目录 一、UDP报文结构简介 1. 源端口号(Source Port,16位): 2. 目的端口号(Destination Port,16位): 3. 长度(Length,16位): 4. 校…...
DBeaver CE 24.1.3 (Windows 64位) 详细安装教程
1. 下载安装包 dbeaver-ce-24.1.3-x86_64-setup.exe下载链接:https://pan.quark.cn/s/5a8dc9ad747f。 下载完成后,双击运行安装程序。 2. 运行安装向导 选择语言:安装程序启动后,选择安装语言(如英文或中文ÿ…...
Java多线程之线程控制
1、线程睡眠——sleep 如果我们需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread的sleep方法 注意如下几点问题 ①、sleep是静态方法,最好不要用Thread的实例对象调用它,因为它睡眠的始终是当前正在运…...
任意波形发生器——2路同步DA模拟量输出卡
定义 任意波形发生器(Arbitrary Waveform Generator, AWG)是一种电子测试仪器,能够通过数字信号处理(DSP)和数模转换(DAC)技术生成非周期性、可编程的任意形状电信号。与传统函数发生器仅支持…...
【Java】 使用 HTTP 响应状态码定义web系统返回码
系统状态码定义 public interface GlobalErrorCodeConstants {ErrorCode SUCCESS new ErrorCode(0, "成功");// 客户端错误段 ErrorCode BAD_REQUEST new ErrorCode(400, "请求参数不正确");ErrorCode UNAUTHORIZED new ErrorCode(401, "账号未登…...
测试反馈陷入死循环?5大策略拆解新旧Bug难题
新旧Bug堆叠,测试反馈陷入死循环,如果不及时解决此问题,往往容易导致项目延期、成本增加、团队效率降低,直接影响产品的市场竞争力 。因此需及时应对此问题,进而保障项目进度如期进行,提升软件质量…...
结合大语言模型的机械臂抓取操作学习
结合大语言模型的机械臂抓取操作学习(完整ppt和代码)无视频 代码能正常运行时不负责答疑! 电子产品,一经出售,概不退换 算法设计、毕业设计、期刊专利!感兴趣可以联系我。 🏆代码获取方式1: 私信…...
待验证---Oracle 19c 在 CentOS 7 上的快速安装部署指南
Oracle 19c 在 CentOS 7 上的快速安装部署指南 Oracle Database 19c 是一个功能强大的企业级数据库系统,下面我将为您提供在 CentOS 7 上快速安装部署 Oracle 19c 的详细步骤。 一、准备工作 1. 系统要求 CentOS 7 (64位)最小内存: 2GB (推荐 8GB 以上)最小磁盘…...
风力发电领域canopen转Profinet网关的应用
在风力发电领域,开疆canopen转Profinet网关KJ-PNG-205的应用案例通常涉及将风力涡轮机内部的CANopen网络与外部的Profinet工业以太网连接起来。这种转换网关允许风力发电场的控制系统通过Profinet协议收集和监控涡轮机的状态信息,同时发送控制命令。 风力…...
vr全景相机如何选择?
VR全景相机,作为虚拟现实技术的核心设备之一,能够拍摄360度全景照片和视频,使用户通过虚拟现实设备身临其境地体验拍摄场景。 这种技术的快速发展,得益于传感器、图像处理和计算机视觉技术的不断进步。 选择一台合适的VR全景相机…...
在 Conda 中,包的安装路径在电脑的哪里
在 Conda 中,包的安装路径取决于你的 Conda 安装方式 和 环境类型(base 或其他虚拟环境)。以下是不同情况下的详细说明: 📌 1. Conda 包的默认安装路径 Conda 将所有包存储在 pkgs 目录 下,并在各个环境中…...
phpstorm用php连接数据库报错
项目场景: phpstorm用php连接数据库 问题描述 用php使用mysql_connect 的时候报错了,没有这个函数 原因分析: php解释器问题,后来查资料得知mysql_connct只适用于php5.5以下解释器。一开始用的7,改成5.3以后还是报…...
今日行情明日机会——20250428
指数依然在震荡区间,等待方向选择~ 2025年4月28日涨停主要行业方向分析 一、核心主线方向 一季报增长(业绩驱动资金避险) • 涨停家数:10家(最强方向)。 • 代表标的: ◦ 珀莱雅(2…...
Spring Boot 3与JDK 8环境下的单元测试实践指南
一、引言 在Java后端开发中,单元测试是保障代码质量的核心手段。Spring Boot作为主流框架,其单元测试体系随着版本迭代不断优化。本文聚焦于JDK 8与Spring Boot 3的组合场景,深入解析单元测试的多种实现方式,对比不同测试策略的异…...
微分与积分(前言)
导数 导数是一个非常重要的概念,先来看一个引例:速度问题。历史上速度问题与倒数概念的形成有着密切的关系。 平均速度 v s t v\frac{s}{t} vts那么如何表示瞬时速度呢? 瞬时经过路程: Δ s s ( t 0 Δ t ) − s ( t 0 ) Δ…...
61. Java 类和对象 - 使用 this 关键字
文章目录 61. Java 类和对象 - 使用 this 关键字1. 在方法或构造函数中引用对象成员1.1 区分同名变量1.2 在普通方法中引用字段或调用方法 2. 在构造函数中调用另一个构造函数示例:构造函数重载 3. 其他用法:返回当前对象4. 注意事项5. 总结 61. Java 类…...
安达发|高效智能塑料切割数控系统 - 全自动化软件解决方案
在当今的制造业中,塑料作为一种轻便、耐用且成本效益高的材料,被广泛应用于各个领域。随着科技的进步和市场需求的变化,塑料加工行业正面临着前所未有的挑战和机遇。为了提高生产效率,降低成本,并满足日益严格的质量标…...