List<Entity>与Map<String, Entity>互转

List 转为 Map<String, Entity>

要将 List<Entity> 转换为 Map<String, Entity>,你需要指定一个属性作为 Map 的键,然后将 List 中的每个实体对象的该属性值作为键,实体对象本身作为值放入 Map 中。以下是一个示例代码:

假设你有一个名为 Entity 的实体类,其中有一个属性名为 id,你想将 List<Entity> 根据 id 属性转换为 Map<String, Entity>:

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;public class Main {public static void main(String[] args) {List<Entity> entityList = ...; // 获取入参 List// 将 List 转换为 MapMap<String, Entity> entityMap = entityList.stream().collect(Collectors.toMap(Entity::getId, entity -> entity));// 现在你可以使用 entityMap 了}static class Entity {private String id;// 其他属性和方法,包括 getter 和 setterpublic String getId() {return id;}public void setId(String id) {this.id = id;}}
}

在上面的示例中,我们使用了 Java 8 的 Stream API,通过 Collectors.toMap() 方法将 List<Entity> 转换为 Map<String, Entity>。在 toMap() 方法中,第一个参数 Entity::getId 指定了将实体对象的 id 属性作为 Map 的键,第二个参数 entity -> entity 指定了将实体对象本身作为 Map 的值。

Map<String, Entity>转为List

要将 Map<String, Entity> 转换为 List<Entity>,你可以使用 Map 的 values() 方法获取所有的实体对象,然后将它们放入一个 List 中。以下是一个示例代码:

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;public class Main {public static void main(String[] args) {Map<String, Entity> entityMap = ...; // 获取入参 Map// 将 Map 转换为 ListList<Entity> entityList = entityMap.values().stream().collect(Collectors.toList());// 现在你可以使用 entityList 了}static class Entity {// 实体类的属性和方法}
}

在上面的示例中,我们使用了 Java 8 的 Stream API,通过 Collectors.toList() 方法将 Map 的值集合转换为 List。 entityMap.values().stream() 获取 Map 的值集合的 Stream 流,然后通过 collect(Collectors.toList()) 将 Stream 流转换为 List。

将List按多个指定的属性进行排序

方式1

如果要按多个指定的属性对 List<Entity> 进行排序,你可以使用 Java 的 Comparator 接口来自定义排序规则。以下是一个示例代码,演示了如何按多个指定的属性对 List<Entity> 进行排序:

假设你的实体类 Entity 包含了多个属性,比如 property1property2,你希望先按 property1 排序,然后在 property1 相同的情况下再按 property2 排序:

import java.util.*;public class Main {public static void main(String[] args) {List<Entity> entityList = ...; // 获取入参 List// 使用 Comparator 自定义排序规则Comparator<Entity> comparator = Comparator.comparing(Entity::getProperty1).thenComparing(Entity::getProperty2);// 对 List 进行排序Collections.sort(entityList, comparator);// 现在 entityList 已按指定属性排序}static class Entity {private int property1;private String property2;// 其他属性和方法,包括 getter 和 setterpublic int getProperty1() {return property1;}public void setProperty1(int property1) {this.property1 = property1;}public String getProperty2() {return property2;}public void setProperty2(String property2) {this.property2 = property2;}}
}

在上面的示例中,我们使用了 Java 8 的 Comparator 接口的 comparing() 方法来按照 property1 进行排序,然后使用 thenComparing() 方法来在 property1 相同的情况下按照 property2 进行排序。最后,我们使用 Collections.sort() 方法将 List 按照自定义的排序规则进行排序。

方式2

当然可以使用实现接口的方式来实现多属性排序。你可以编写一个实现 Comparator 接口的类,并在其中定义自定义的排序逻辑。以下是一个示例代码:

import java.util.*;public class Main {public static void main(String[] args) {List<Entity> entityList = ...; // 获取入参 List// 使用自定义的排序类进行排序Comparator<Entity> comparator = new MultiPropertyComparator();Collections.sort(entityList, comparator);// 现在 entityList 已按指定属性排序}static class Entity {private int property1;private String property2;// 其他属性和方法,包括 getter 和 setterpublic int getProperty1() {return property1;}public void setProperty1(int property1) {this.property1 = property1;}public String getProperty2() {return property2;}public void setProperty2(String property2) {this.property2 = property2;}}static class MultiPropertyComparator implements Comparator<Entity> {@Overridepublic int compare(Entity entity1, Entity entity2) {// 先按 property1 排序int result = Integer.compare(entity1.getProperty1(), entity2.getProperty1());if (result != 0) {return result;}// 如果 property1 相同,则按 property2 排序return entity1.getProperty2().compareTo(entity2.getProperty2());}}
}

在上面的示例中,我们创建了一个名为 MultiPropertyComparator 的实现了 Comparator 接口的内部类,实现了 compare() 方法来定义多属性排序逻辑。然后我们使用这个自定义的排序类进行排序。

方式3

是的,你可以通过让实体类实现 Comparable 接口来定义排序规则。这样,你就可以直接使用 Collections.sort() 方法对实体对象的 List 进行排序,而无需显式地传递 Comparator。

以下是一个示例代码,演示了如何让实体类实现 Comparable 接口来完成排序功能:

import java.util.*;public class Main {public static void main(String[] args) {List<Entity> entityList = ...; // 获取入参 List// 对 List 进行排序Collections.sort(entityList);// 现在 entityList 已按指定属性排序}static class Entity implements Comparable<Entity> {private int property1;private String property2;// 其他属性和方法,包括 getter 和 setter// 实现 compareTo 方法,定义排序规则@Overridepublic int compareTo(Entity other) {// 先按 property1 排序int result = Integer.compare(this.property1, other.property1);if (result != 0) {return result;}// 如果 property1 相同,则按 property2 排序return this.property2.compareTo(other.property2);}// 其他属性的 getter 和 setter 方法}
}

在上面的示例中,我们让实体类 Entity 实现了 Comparable 接口,并重写了 compareTo 方法来定义排序规则。然后我们可以直接使用 Collections.sort() 方法对实体对象的 List 进行排序,因为实体类已经定义了排序规则。

List 根据id排序

方式1

要根据实体类中的 id 属性对 List<Entity> 进行排序,你可以按照以下步骤操作:

  1. 让实体类实现 Comparable 接口,并在其中重写 compareTo 方法,根据 id 属性进行比较。
  2. 调用 Collections.sort() 方法对 List 进行排序。

下面是一个示例代码:

import java.util.*;public class Main {public static void main(String[] args) {List<Entity> entityList = ...; // 获取入参 List// 对 List 进行排序Collections.sort(entityList);// 现在 entityList 已按 id 排序}static class Entity implements Comparable<Entity> {private Long id;// 其他属性和方法,包括 getter 和 setter// 实现 compareTo 方法,定义排序规则@Overridepublic int compareTo(Entity other) {return this.id.compareTo(other.id);}// id 的 getter 和 setter 方法public Long getId() {return id;}public void setId(Long id) {this.id = id;}}
}

在上面的示例中,我们让实体类 Entity 实现了 Comparable 接口,并重写了 compareTo 方法来根据 id 属性进行比较。然后我们可以直接使用 Collections.sort() 方法对实体对象的 List 进行排序,因为实体类已经定义了排序规则。

方式2 不使用实现接口的方式

如果不想使用实现接口的方式,你可以使用 Comparator 来定义排序规则,并将其作为参数传递给 Collections.sort() 方法。以下是一个示例代码:

import java.util.*;public class Main {public static void main(String[] args) {List<Entity> entityList = ...; // 获取入参 List// 使用 Comparator 定义排序规则Comparator<Entity> comparator = Comparator.comparingLong(Entity::getId);// 对 List 进行排序Collections.sort(entityList, comparator);// 现在 entityList 已按 id 排序}static class Entity {private Long id;// 其他属性和方法,包括 getter 和 setter// id 的 getter 和 setter 方法public Long getId() {return id;}public void setId(Long id) {this.id = id;}}
}

在上面的示例中,我们使用 Comparator.comparingLong() 方法创建了一个按照 id 属性进行比较的 Comparator,并将其传递给 Collections.sort() 方法来对 List 进行排序。

List指定多个属性判断是否存在重复的数据

如果在实体类的多个属性中存在 null 值,并且你想要判断是否存在重复的数据,可以使用 Map 来记录已经出现过的属性组合,然后进行遍历判断。以下是一个示例代码,演示了如何判断 List<Entity> 中是否存在重复的数据,其中 nameage 属性中可能存在 null 值:

import java.util.*;public class Main {public static void main(String[] args) {List<Entity> entityList = ...; // 获取入参 List// 使用 Map 记录已经出现过的属性组合Map<String, Set<Integer>> attributeMap = new HashMap<>();boolean hasDuplicate = false;for (Entity entity : entityList) {// 根据实体对象的属性值构建属性组合的字符串表示String attributeKey = entity.getName() + "-" + entity.getAge();// 如果属性组合已经存在,则说明存在重复数据if (attributeMap.containsKey(attributeKey)) {hasDuplicate = true;break;}// 将属性组合放入 Map 中Set<Integer> ids = attributeMap.computeIfAbsent(attributeKey, k -> new HashSet<>());ids.add(entity.getId());}if (hasDuplicate) {System.out.println("存在重复数据");} else {System.out.println("不存在重复数据");}}static class Entity {private Integer id;private String name;private Integer age;// 其他属性和方法,包括 getter 和 setter// id、name 和 age 的 getter 和 setter 方法public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}}
}

在上面的示例中,我们使用了一个 HashMap 来记录已经出现过的属性组合,其中键是由 nameage 组成的字符串,值是出现过该属性组合的实体对象的 ID 集合。然后我们遍历 List,对每个实体对象构建属性组合的字符串表示,检查该字符串是否已经在 Map 中存在,如果存在则说明存在重复数据。

实战

package com.exer;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;public class Main {public static void main(String[] args) {Entity entity1 = new Entity(1L,"qq", "10");Entity entity2 = new Entity(3L,null, "12");Entity entity3 = new Entity(2L,"ww", "11");List<Entity> entityList1 = Arrays.asList(entity1, entity2, entity3);// 将 List 转换为 MapMap<Long, Entity> entityMap = entityList1.stream().collect(Collectors.toMap(Entity::getId, entity -> entity));System.out.println("entityMap = " + entityMap);System.out.println("entityList1 = " + entityList1);entityList1.sort(Comparator.comparingLong(Entity::getId));System.out.println("entityList1 = " + entityList1);// 添加不重复的Map idEntity entity6 = new Entity(null,"aa", "13");Entity entity7 = new Entity(null,"null", "12");Entity entity8 = new Entity(2L,"dd", "15");List<Entity> entityList2 = Arrays.asList(entity6, entity7, entity8);for (int i = 0; i < entityList2.size(); i++) {if (entityList2.get(i).getId() != null) {entityMap.put(entityList2.get(i).getId(),entityList2.get(i));} else {entityMap.put((entityList1.get(entityList1.size() - 1).getId() + i + 1), entityList2.get(i));}}System.out.println("entityMap = " + entityMap);// 将 Map 转换为 ListList<Entity> entities = new ArrayList<>(entityMap.values());System.out.println("entities = " + entities);// List<Entity> 判断是否有重复Set<String> keySet = new HashSet<>();for(Entity entity : entities) {if(!keySet.add(entity.getKey())){System.out.println("存在重复数据");}}}
}
package com.exer;public class Entity {private Long id;private String name;private String age;public String getKey(){return name + age;}public Entity() {}public Entity(Long id, String name, String age) {this.id = id;this.name = name;this.age = age;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}@Overridepublic String toString() {return "Entity{" +"id=" + id +", name='" + name + '\'' +", age='" + age + '\'' +'}';}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/826346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LCR 023. 相交链表

给定两个单链表的头节点 headA 和 headB &#xff0c;请找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&#xf…

Git - 在PyCharm/Idea中集成使用Git

文章目录 Git - 在PyCharm/Idea中集成使用Git1.新建GitHub仓库2.将仓库与项目绑定3.在PyCharm中使用Git4.新建Gitee仓库5.将仓库与项目绑定6.在IDEA中使用Git Git - 在PyCharm/Idea中集成使用Git 本文详细讲解了如何在 PyCharm 或 Idea 中配置 Gitee 或 GitHub 仓库&#xff0…

《黑羊效应》一群好人欺负一个好人,其他好人却坐视不管的诡谲现象 - 三余书屋 3ysw.net

黑羊效应&#xff1a;一群好人欺负一个好人&#xff0c;其他好人却坐视不管的诡谲现象 大家好&#xff0c;今天我们要解读的书是《黑羊效应》。黑羊效应是一种心理陷阱&#xff0c;指的是一群好人欺负一个好人&#xff0c;而其他好人却坐视不理。我们每个人或多或少都目睹过或…

大一上考核题解

文章目录 [238. 除自身以外数组的乘积](https://leetcode.cn/problems/product-of-array-except-self/)代码题解 [73. 矩阵置零](https://leetcode.cn/problems/set-matrix-zeroes/)代码题解 [394. 字符串解码](https://leetcode.cn/problems/decode-string/)代码题解 [23. 合并…

每日一题

腐烂的苹果_牛客题霸_牛客网 思路分析:广度优先遍历&#xff0c;找到所有腐烂的苹果同时向四方扩散&#xff0c;就是第一轮把所有腐烂的苹果加入队列中&#xff0c;这就跟MQ的消息队列的原理差不多&#xff0c;第一次记录队列的长度&#xff0c;广度遍历一次&#xff0c;长度--…

HCIP-OSPF综合实验

一实验拓扑图 二.实验要求 1、R4为ISP&#xff0c;其上只配置IP地址&#xff1b;R4与其他所直连设备间均使用公有IP&#xff1b; 2、R3-R5、R6、R7为MGRE环境&#xff0c;R3为中心站点&#xff1b; 3、整个OSPF环境IP基于172.16.0.0/16划分&#xff1b;除了R12有两个环回&…

Xinstall:让URL打开App变得如此简单

在移动互联网时代&#xff0c;App已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;在使用App的过程中&#xff0c;我们常常会遇到一些烦恼。比如&#xff0c;当我们通过一个网页链接想要打开对应的App时&#xff0c;往往需要先复制链接&#xff0c;然后在App中粘贴&a…

简要概述如何做好程序设计功能

文章目录 功能设计流程图数据库设计缓存设计job设计接口设计监控设计预案设计 功能设计流程图 与外部系统交互、本系统模块之间流程&#xff0c;比较好用的画圈软件draw .io或在线的process on 数据库设计 从DDD角度界限上下文、ER图、评审表结构设计是否合理&#xff0c;表…

力扣287. 寻找重复数

Problem: 287. 寻找重复数 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 利用二分查找搜索1 ~ n中重复的元素&#xff0c;我们每次取出当前二分查找的区间的中间元素mid并在元始的数组nums中统计小于mid的元素的个数count&#xff1a; 若count > mid则说明重复的…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 4月20日,星期六

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年4月20日 星期六 农历三月十二 1、 证监会&#xff1a;调降基金股票交易佣金费率&#xff0c;年度降幅测算将达38%&#xff0c;7月1日起实施。 2、 民政部举办全国“乡村著名行动”培训班&#xff0c;助力乡村振兴。 3、…

OJ刷题日记:4、滑动窗口(2)

目录 1、904.水果成篮 2、438.找到字符串中所有字母异位词 3、30.串联所有单词的子串 4、76.最小覆盖子串 1、904.水果成篮 题目&#xff1a; 904. 水果成篮 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/fruit-into-baskets/description/ 你正在…

ROS2学习笔记(一) 基本概念

1. Node 节点 节点: 完成具体功能的模块 相关命令 #运行命令 ros2 run <package_name> <executable_name>#当前节点查询查询 ros2 node list#重映射 Remapping ros2 run <package_name> <executable_name> --ros-args --remap __node:<node_na…

机器学习和深度学习的区别

机器学习与深度学习的区别 一、原理差异二、应用差异三、实现方式差异四、在实际应用中扮演的角色1、图像识别和计算机视觉2、自然语言处理NLP3、语音识别领域4、其它—智能制造/医疗健康/金融/教育 五、总结 在人工智能领域&#xff0c;机器学习和深度学习是两个重要的概念&am…

Springboot框架——3.整合SpringMVC

1.修改端口号&#xff1a; 在application.properties中添加如下配置即可&#xff1a; server.port8088 2.静态资源访问&#xff1a; 首先打开ResourceProperties这个类的源码&#xff1a; 将静态资源放到类中默认位置即可实现访问&#xff1a; http://localhost:8088/erth.jp…

HCIE-Shell实验1

要求&#xff1a; 判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查一次磁盘剩余空间。判断web服务是否运行(1、査看进程的方式判断该程序是否运行&#xff0c;2、通过查看端口的方式判断该程序是否运行)&…

小红书情感博主暴力玩法,流量巨大,客单300+

这个项目的盈利核心在于提供情感咨询服务&#xff0c;每笔交易的利润通常在200到300元之间&#xff0c;这种方式比撰写大量情感内容来吸引流量要简单得多&#xff0c;可以说是一种快速超车的策略。 项 目 地 址 &#xff1a; laoa1.c n 我们以男性的视角提供感情建议&a…

【SpringBoot】springboot的启动初步理解

springboot的启动初步理解 我们会发现开发一个Spring Boot&#xff0c;都会有一个注解SpringBootApplication和一个类定义SpringApplication.run&#xff0c;点击源码可以查看到如下代码&#xff1a; Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Document…

OpenHarmony其他工具类—libharu [GN编译]

简介 libharu主要用于生成 PDF格式文件。 下载安装 直接在OpenHarmony-SIG仓中搜索libharu并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 库代码存放路径&#xff1a;./third_party/libharu 修改添加依赖的编译脚本&#xff0c;路径&#xff1a;/developtools…

Linux的firewalld防火墙

介绍firewalld&#xff1a; ①、firewalld&#xff08;Dynamic Firewall Manager of Linux systems&#xff0c;Linux系统的动态防火墙管理器&#xff09;服务是默认的防火墙配置管理工具&#xff0c;它拥有基于CLI&#xff08;命令行界面&#xff09;和基于GUI&#xff08;图…

Modelsim与Verilog入门

0.什么是Modelsim&#xff1f; Modelsim是一个支持多语言的仿真环境&#xff0c;比如我知道的Verilog和VHDL语言都可以在里边使用&#xff0c;这俩都是硬件描述语言&#xff1b; 即就是个软件&#xff0c;你可以用Verilog语言来写代码&#xff0c;然后编译&#xff0c;仿真出…