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

处理对象集合,输出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)自动处理顺序问题
​(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())));

http://www.xdnf.cn/news/2732.html

相关文章:

  • Android学习总结之Java篇(一)
  • 记一次pdf转Word的技术经历
  • Mioty|采用报文分割(Telegram Splitting)以提高抗干扰能力的无线通信技术
  • elasticsearch底层模块解析与实践系列
  • 基于大模型的胆总管结石全流程预测与临床应用研究报告
  • 基于 SpringBoot 与 Redis 的缓存预热案例
  • 【计算机视觉】CV实战项目-高分辨率遥感图像语义分割:High-Resolution-Remote-Sensing-Semantic-Segmentation
  • 《Vue3学习手记6》
  • 人工智能期末复习1
  • Java8 后接口的用法总结
  • 「Mac畅玩AIGC与多模态04」开发篇01 - 创建第一个 LLM 对话应用
  • 深入理解布隆过滤器:参数设定与优化
  • EXCEL常用函数公式和VBA汇总第二篇
  • CUDA Stream 回调函数示例代码
  • 迷你世界UGC3.0脚本Wiki二维表介绍介绍
  • NodeJs模块化与JavaScript的包管理工具
  • 快手极速版安卓版流量消耗与观看体验优化评测
  • JAVA数据结构
  • (即插即用模块-特征处理部分) 四十二、(2024 TPAMI) FreqFusion 频率特征融合
  • Nginx的默认主配置文件 “/etc/nginx/nginx.conf“ 解读
  • SQL Server 存储过程开发手册
  • 2025系统架构师---主程序/子程序架构风格
  • 小白学习java第16天(上): javaWeb
  • 【Redis】基础3:一些应用场景
  • TCP协议
  • 2个关键思路,让微课动画场景制作别具一格
  • Fps鬼泣总结:通信——伤害检测
  • 【数据结构】顺序表
  • 伺服电机AB相输出,接入定时器通道,对定时器IO口的速率有何要求【详细分析】
  • 【Unity完整游戏开发案例】从0做一个太空大战游戏