Java中Set的巧妙用法---查找重复元素/去重/排序

目录

1. Set特性:

3. TreeSet

3.1定制排序(比较器排序)

3.2自然排序:

4. LinkedHashSet


在日常开发中不可避免会遇到需要去重,或者查找重复元素,下面给介绍一种效率比较高的方法,时间复杂度为O(n)      

1. Set特性:

①不允许出现重复元素;

②集合中的元素位置无顺序;

③有且只有一个值为null的元素。

Set的主要实现类有:HashSet,TreeSet,LinkedHashSet,这几个类得一共同点都是相同的只能保存一份。

2. HashSet

HashSet能够较快的获取集合中的元素,它是通过hashCode和equals方法来判断两个对象是否相等,如果hashCode值一样则会进一步调用equals方法来判断是否相等,如果为true则表示项目,如果为false则表示不同。

简单示例代码如下:

Student类


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {private String name;private String studentId;private String phone;@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", studentId='" + studentId + '\'' +", phone='" + phone + '\'' +'}';}
}

Main测试方法如下:


import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;public class MainTest {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student("张三", "1234","1111"));list.add(new Student("张三", "1234","1111"));list.add(new Student("张三", "1234","1234"));list.add(new Student("李四", "1234","2222"));list.add(new Student("李四", "1234","3333"));list.add(new Student("王五", "4567","2222"));list.add(new Student("老六", "8910","2222"));Set<Student> set = new HashSet<>();list.forEach(item->{if (!set.add(item)){System.out.println("该学生重复:" + item);}});System.out.println(set.size() + ": " + set);}}

输出结果如下:

HashSet的add方法会返回一个布尔类型的值,如果为true则表示插入成功,如果为false则插入失败(插入失败就是出现了重复的元素)。你会发现默认的是student类的三个属性name,student,phone相等才会判断相等。

进阶实例:

需求:只要姓名和学号相同的学生则认为是同一个学生

根据需求我们需要重写student类的hashcode和equals方法使其只需要判断姓名和学号即可。代码如下:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Objects;@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {private String name;private String studentId;private String phone;@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", studentId='" + studentId + '\'' +", phone='" + phone + '\'' +'}';}@Overridepublic boolean equals(Object o) {System.out.println("我是equals方法");if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;//在这里默认会使用name,studentId, phone三个属性,我们只需要改为name和studentId属性即可
//        return Objects.equals(name, student.name) && Objects.equals(studentId, student.studentId) && Objects.equals(phone, student.phone);//根据需求我们只需要该为只判断name和studentId即可return Objects.equals(name, student.name) && Objects.equals(studentId, student.studentId);}@Overridepublic int hashCode() {System.out.println("我是hashCode方法");//Objects.hash方法的参数是一个可变参数可以根据自己需求来变动//默认是使用类的所有属性的hashcode值来判断hashcode是否相同
//        return Objects.hash(name, studentId, phone);//根据需求我们只需要给成name和studentId即可return Objects.hash(name, studentId);}
}

Main测试方法没变化:


import com.example.testdemo.entity.Student;import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;public class MainTest {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student("张三", "1234","1111"));list.add(new Student("张三", "1234","1111"));list.add(new Student("张三", "1234","1234"));list.add(new Student("李四", "1234","2222"));list.add(new Student("李四", "1234","3333"));list.add(new Student("王五", "4567","2222"));list.add(new Student("老六", "8910","2222"));Set<Student> set = new HashSet<>();list.forEach(item->{if (!set.add(item)){System.out.println("该学生重复:" + item);}});System.out.println(set.size() + ": " + set);}}

输出结果如下:

以上这种方法也是用的最多的。

3. TreeSet

TreeSet也不能插入重复元素并且能够进行排序(通过自然排序和定制排序)

3.1定制排序(比较器排序)

代码实例:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {private String name;private String studentId;private String phone;@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", studentId='" + studentId + '\'' +", phone='" + phone + '\'' +'}';}
}
import java.util.*;public class MainTest {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student("张三", "1234","1111"));list.add(new Student("张三", "1234","1111"));list.add(new Student("张三", "1234","1234"));list.add(new Student("李四", "1234","2222"));list.add(new Student("李四", "1234","3333"));list.add(new Student("王五", "4567","2222"));list.add(new Student("老六", "8910","2222"));TreeSet<Student> set = new TreeSet<>(new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {return o1.getName().compareTo(o2.getName()) + o1.getStudentId().compareTo(o2.getStudentId());}});list.forEach(item->{if (!set.add(item)){System.out.println("该学生重复:" + item);}});System.out.println(set.size() + ": " + set);}
}

其中compare方法的返回值如果是0则表示两者相等,如果是小于0则表示第一个对象o1小于第二个对象o2,如果大于0则表示o1大于o2(compare方法既有排序的作用也有去重的作用)

3.2自然排序:

实现comparable接口的compare方

代码如下:


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student implements Comparable<Student> {private String name;private String studentId;private String phone;@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", studentId='" + studentId + '\'' +", phone='" + phone + '\'' +'}';}@Overridepublic int compareTo(Student o) {return this.getName().compareTo(o.getName()) + this.getStudentId().compareTo(o.getStudentId());}
}

import com.example.testdemo.entity.Student;import java.util.*;public class MainTest {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student("张三", "1234","1111"));list.add(new Student("张三", "1234","1111"));list.add(new Student("张三", "1234","1234"));list.add(new Student("李四", "1234","2222"));list.add(new Student("李四", "1234","3333"));list.add(new Student("王五", "4567","2222"));list.add(new Student("老六", "8910","2222"));TreeSet<Student> set = new TreeSet<>();list.forEach(item->{if (!set.add(item)){System.out.println("该学生重复:" + item);}});System.out.println(set.size() + ": " + set);}
}

看自己喜欢用哪一个即可。

4. LinkedHashSet

LinkedHashSet是HashSet和LinkedHashMap的结合体。它既有HashSet的快速查找和不允许重复元素的特性,又有LinkedHashMap的有序性和迭代器的快速遍历特性。因此,在需要保持元素顺序的情况下,我们可以使用LinkedHashSet。

心中若有光芒,脚下自有道路,勇往直前,无畏前行!!!

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

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

相关文章

Git使用教程-将idea本地文件配置到gitte上的保姆级别教程

&#x1f939;‍♀️潜意识起点&#xff1a;个人主页 &#x1f399;座右铭&#xff1a;得之坦然&#xff0c;失之淡然。 &#x1f48e;擅长领域&#xff1a;前端 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是我持…

weblogic CVE-2018-2894 靶场攻略

漏洞描述 Weblogic Web Service Test Page中⼀处任意⽂件上传漏洞&#xff0c;Web Service Test Page 在 "⽣产模式"下默认不开启&#xff0c;所以该漏洞有⼀定限制。 漏洞版本 weblogic 10.3.6.0 weblogic 12.1.3.0 weblogic 12.2.1.2 28 weblogic 12.2.1.3 …

传统美业通过小魔推短视频矩阵系统,实现逆势增长?

许多美甲店在经营过程中常常陷入一个误区&#xff1a;他们认为自己缺少的是客户&#xff0c;但实际上&#xff0c;他们真正缺少的是有效的营销策略&#xff0c;美甲店经营者普遍面临的两大难题包括&#xff1a; 1. 高客户流失率&#xff1a; 据研究显示&#xff0c;约70%的顾…

初识linux(2)

接着上篇的初识linux(1)来接着说没看过的可以去看看 cp指令 语法&#xff1a;cp [选项] 源文件或目录 目标文件或目录 功能: 复制文件或目录 说明: cp指令用于复制文件或目录&#xff0c;如同时指定两个以上的文件或目录&#xff0c;且最后的目的地是一个已经存在的目录&#…

Python和C++及R相关系数数学统计学可视化和神经模型及评估指标

&#x1f3af;要点 较少统计样本显著性评估和变量关系梳理功能磁共振成像一致性分析检测非单调关联性结构随机变量动力学相关性热图和矩阵图基因疫苗非线性变量相关性 Python相关矩阵 相关矩阵 n n n 个随机变量 X 1 , … , X n X_1, \ldots, X_n X1​,…,Xn​ 的相关矩阵…

CTF流量分析题目一把梭,零基础入门到精通,收藏这一篇就够了

https://github.com/Arinue/CTF-NetA CTF-NetA是一款专门针对CTF比赛的网络流量分析工具&#xff0c;可以对常见的网络流量进行分析&#xff0c;快速自动获取flag。而且是有gui图形界面的&#xff0c;有了它即使小白也能轻松应对流量分析题目&#xff0c;不得不说这CTF工具太专…

论文笔记:交替单模态适应的多模态表征学习

整理了CVPR2024 Multimodal Representation Learning by Alternating Unimodal Adaptation&#xff09;论文的阅读笔记 背景MLA框架实验Q1 与之前的方法相比&#xff0c;MLA能否克服模态懒惰并提高多模态学习性能?Q2 MLA在面临模式缺失的挑战时表现如何?Q3 所有模块是否可以有…

Java 多态(难)

1. 即同一方法可以根据发送对象的不同而采用多种不同的行为方式。 2&#xff0e;一个对象的实际类型是确定的&#xff0c;但可以指向对象的引用的类型有很多。 举例说明&#xff1a;新建两个类&#xff0c;Person类和Student类&#xff0c;Student类继承Person类&#xff1a…

【学习笔记】数据结构(六 ①)

树和二叉树 &#xff08;一&#xff09; 文章目录 树和二叉树 &#xff08;一&#xff09;6.1 树(Tree)的定义和基本术语6.2 二叉树6.2.1 二叉树的定义1、斜树2、满二叉树3、完全二叉树4、二叉排序树5、平衡二叉树&#xff08;AVL树&#xff09;6、红黑树 6.2.2 二叉树的性质6.…

Linux启动流程,0,1,2进程,init进程,idle进程,内核态到用户态的kernel_execve(一)

&#xff1f;是&#xff0c;如果定义了&#xff0c;就按Makefile的&#xff0c;如果如下make编译时&#xff0c;就按如下 linux内核入口 进程0在用户空间看不到&#xff0c;因为他是内核进程 进程2就是守护进程&#xff0c;维护内涵运转的 一生二&#xff0c;二生三&#xff…

Redis中Hash(哈希)类型的基本操作

文章目录 一、 哈希简介二、常用命令hsethgethexistshdelhkeyshvalshgetallhmgethlenhsetnxhincrbyhincrbyfloathstrlen 三、命令小结四、哈希内部编码方式五、典型应用场景六、 字符串&#xff0c;序列化&#xff0c;哈希对比 一、 哈希简介 几乎所有的主流编程语言都提供了哈…

CANopen开源库canfestival的移植

本文记录将CANopen开源库CANfestival移植到GD32F470单片机的过程。CANopen协议理解请参考博客&#xff1a;CANopen协议的理解-CSDN博客 CANfestival开源库下载链接 CSDN链接&#xff1a; https://download.csdn.net/download/heqiunong/89774627 官网链接&#xff1a;https:/…

智能BI项目第五期

本期主要内容 系统问题分析异步化业务流程分析线程池讲解&#xff08;入门 原理 实战&#xff09;系统异步化改造开发 1.系统问题分析 当系统面临大量用户请求时&#xff0c;我们后端的 AI 处理能力有限&#xff0c;例如服务器的内存、CPU、网络带宽等资源有限&#xff0c…

基于微信小程序的游泳馆管理系统--论文源码调试讲解

2 关键技术介绍 2.1 SSM框架 开发信息管理系统的主流框架是SSM&#xff08;Spring Spring MVC MyBatis&#xff09;&#xff0c;SSM框架web层使用Spring MVC框架&#xff0c;使传输前后端数据变得简单&#xff1b;对于业务层使用Spring作为轻量级控制反转和面向切面的容器框…

redis分布式锁(看门枸机制)

分布式锁确保在同一时间只有一个节点能获得对共享资源的独占访问权限&#xff0c;从而解决并发访问问题。 Redisson锁(简称看门狗) 它可以实现锁的延长&#xff0c;确保某个线程执行完才能让其他线程进行抢锁操作 引入看门狗机制后 如何使用&#xff1f; 1、引入依赖包 <…

Java数据结构专栏介绍

专栏导读 在软件工程的世界里&#xff0c;数据结构是构建高效、可靠程序的基石。"Java数据结构"专栏致力于为Java开发者提供一个全面、深入的学习平台&#xff0c;帮助他们掌握各种数据结构的原理、实现及其在Java中的应用。通过这个专栏&#xff0c;读者将能够提升…

【第34章】Spring Cloud之SkyWalking分布式日志

文章目录 前言一、准备1. 引入依赖 二、日志配置1. 打印追踪ID2. gRPC 导出 三、完整日志配置四、日志展示1. 前端2. 后端 总结 前言 前面已经完成了请求的链路追踪&#xff0c;这里我们通过SkyWalking来处理分布式日志&#xff1b; 场景描述&#xff1a;我们有三个服务消费者…

Hive企业级调优[3]—— Explain 查看执行计划

Explain 查看执行计划 Explain 执行计划概述 EXPLAIN 命令呈现的执行计划由一系列 Stage 组成。这些 Stage 之间存在依赖关系&#xff0c;每一个 Stage 可能对应一个 MapReduce Job 或者一个文件系统的操作等。如果某 Stage 对应了一个 MapReduce Job&#xff0c;则该 Job 在 …

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【内核通信机制】下

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核&#xff08;LiteOS-M&#xff09; 轻量系统内核&#…

微信支付开发-后台统计工厂实现

一、数据库设计图 二、后端统计工厂逻辑 1、统计父抽象类 a、StatisticsHandle.php 2、统计工厂通道类 a、StatisticsFactory.php 3、查询实现类 a、答题统计(Answer.php) 三、后端统计工厂代码实现 1、统计父抽象类(StatisticsHandle.php) <?php /*** 统计父抽象类* Use…