Java: 如何去除对象数组中的重复元素?
最编程
2024-02-02 07:44:32
...
java对象数组去重;
- 将原数组插入到新数组的时候,将插入的对象和新数组中的已插入对象进行比较,若不相同,则插入到新的数组中;
- 使用hashSet进行对象的去重(需要将list中对象的hasCode()、equals()方法进行重写,然后放到set集合中)
package com.arraySort;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
public class DistinctPerson {
private String name;
private int score;
public DistinctPerson(int score, String name) {
super();
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
/**
* 当name相同,就认定两个对象相等
*
* @param o
* @return
*/
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
DistinctPerson that = (DistinctPerson) o;
return Objects.equals(name, that.name);
}
/**
* 仅使用name字段的值来生成hashcode;
*
* @return
*/
@Override
public int hashCode() {
return Objects.hash(name);
}
@Override
public String toString() {
return "DistinctPerson{" +
"name='" + name + '\'' +
", score=" + score +
'}';
}
private static List<DistinctPerson> initList() {
List<DistinctPerson> distinctPeople = new ArrayList<DistinctPerson>();
distinctPeople.add(new DistinctPerson(980, "M1"));
distinctPeople.add(new DistinctPerson(34, "M2"));
distinctPeople.add(new DistinctPerson(12, "M3"));
distinctPeople.add(new DistinctPerson(65, "M4"));
distinctPeople.add(new DistinctPerson(12, "M5"));
distinctPeople.add(new DistinctPerson(33, "M6"));
distinctPeople.add(new DistinctPerson(90, "M7"));
distinctPeople.add(new DistinctPerson(123, "M8"));
distinctPeople.add(new DistinctPerson(124, "M8"));
return distinctPeople;
}
private static void pirntList(String title, List<DistinctPerson> distinctPeople) {
System.out.println("==============" + title + "=================");
for (DistinctPerson distinctPerson : distinctPeople) {
System.out.println(distinctPerson.toString());
}
}
public static void main(String[] args) {
// 方法一:将原数组插入到新数组的时候,将插入的对象和新数组中的已插入对象进行比较,若不相同,则插入到新的数组中;
List<DistinctPerson> distinctPeople = initList();
List<DistinctPerson> newDistinctPeople = new ArrayList<>();
distinctPeople.forEach(t -> {
//anyMatch表示有一个匹配就返回true;
boolean match = newDistinctPeople.stream().anyMatch(u -> t.getName().equals(u.getName()));
if (!match) {
newDistinctPeople.add(t);
}
});
pirntList("方法一", newDistinctPeople);
/**
方法二:使用hashSet进行对象的去重(需要将list中对象的hasCode()、equals()方法进行重写,然后放到set集合中)
* 若对象中的equals方法的返回值为true,hashCode方法的返回值必定是相同的;
*/
distinctPeople = initList();
distinctPeople = distinctPeople.parallelStream().distinct().collect(Collectors.toList());
pirntList("方法二", distinctPeople);
}
}
运行结果如下:
==============方法一=================
DistinctPerson{name='M1', score=980}
DistinctPerson{name='M2', score=34}
DistinctPerson{name='M3', score=12}
DistinctPerson{name='M4', score=65}
DistinctPerson{name='M5', score=12}
DistinctPerson{name='M6', score=33}
DistinctPerson{name='M7', score=90}
DistinctPerson{name='M8', score=123}
==============方法二=================
DistinctPerson{name='M1', score=980}
DistinctPerson{name='M2', score=34}
DistinctPerson{name='M3', score=12}
DistinctPerson{name='M4', score=65}
DistinctPerson{name='M5', score=12}
DistinctPerson{name='M6', score=33}
DistinctPerson{name='M7', score=90}
DistinctPerson{name='M8', score=123}
推荐阅读
-
35 岁实现财务*,腾讯程序员手握2300万提前退休?-1000万房产、1000万腾讯股票、加上300万的现金,一共2300万的财产。有网友算了一笔账,假设1000万的房产用于自住,剩下1300万资产按照平均税后20-50万不等进行计算,大约花上26-60年左右的时间才能赚到这笔钱。也就是说,普通人可能奋斗一辈子,才能赚到这笔钱。在很多人还在为中年危机而惶惶不可终日的时候,有的人的35岁,就已经安全着陆,试问哪个打工人不羡慕?但问题是有这样财富积累必然有像样的实力做靠山。没有人可以不劳而获。 看到这里,肯定有人说,那么对于普通人来说,卷可能真就成了唯一的出路。但是卷也有轻松的卷,“偷懒”的卷法,对于程序员而言,刨除掉一时无法改掉的开会传统占用的大部分时间,如何把有限的时间和精力放在真正重要的架构设计、需求设计上,而不是重复的造*,编码、改bug、手动测试。因此在科技改变生活的今天,学会使用AI工具成为程序员们的必备技能。 以全栈式全自动的软件开发工具飞算SoFlu软件机器人为例,作为全球首款面向微服务架构设计和最佳实践的软件机器人,SoFlu软件机器人改变了原来手工编码的作业模式,通过可视化拖拽方式以及参数配置就能实现等同于编写复杂代码的业务逻辑,在设计业务逻辑时就完成了微服务应用开发,做到“业务即图,图即代码”,实现“软件开发,十倍提效”。 而作为飞算SoFlu软件机器人的一个重要组成部分,FuncGPT(慧函数)支持所有类型函数创建。通过自然语言描述Java函数需求,实时生成高质量、高可读性的Java函数代码。生成代码可直接复制到IDEA,或一键导入Java全自动开发工具函数库。 FuncGPT(慧函数)具有五大核心能力: ● 自然语言:通过自然语言即可生成函数,降低软件开发门槛。 ● 秒级函数开发:全自动秒级开发函数,秒级完成,效率千倍提升。 ● 一站式函数开发应用:函数生成即可直接应用,效率、安全有保障。 ● 质量可靠:生成的函数代码符合业界规范、具备良好的可读性,符合最优解。 ● 灵活生成:可以根据开发人员的具体需求生成并支持调整和修改。 以“将文件流转换为File对象”这个需求为例,以下是FuncGPT(慧函数)秒级生成的代码: / 类名:FileConverter // 函数名:convertStreamToFile // 函数功能:将文件流转换为File对象 // POM依赖包:无 import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; public class FileConverter { /** * 将文件流转换为File对象 * @param inputStream 文件流 * @param filePath 文件路径 * @param fileName 文件名 * @return 转换后的File对象 * @throws IOException 如果发生I/O异常 */ public static File convertStreamToFile(InputStream inputStream, String filePath, String fileName) throws IOException { File file = new File(filePath + File.separator + fileName); // 创建File对象 try (FileOutputStream outputStream = new FileOutputStream(file)) { // 创建文件输出流 byte buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { // 从文件流读取数据并写入文件 outputStream.write(buffer, 0, bytesRead); } } return file; // 返回转换后的File对象 } } // 函数示例 // 将文件流转换为File对象示例 // 入参:inputStream,文件流 // 入参:filePath,文件路径 // 入参:fileName,文件名 // 出参:file,转换后的File对象 // 调用示例: // InputStream inputStream = new FileInputStream("example.txt"); // String filePath = "C:\\Users\\User\\Documents"; // String fileName = "example.txt"; // File file = FileConverter.convertStreamToFile(inputStream, filePath, fileName); // System.out.println(file.getAbsolutePath); // 输出结果:例如,将文件流转换为File对象后,文件的绝对路径为:C:\Users\User\Documents\example.txt // 则输出结果为:C:\Users\User\Documents\example.txt 通过分析,不难发现以上代码:
-
如何在 Java 中反转数组?在 Java 中反转数组的 2 种方法(代码示例)
-
Java 类加载器的作用 - 简介:类加载器是 Java™ 中一个非常重要的概念。类加载器负责将 Java 类的字节码加载到 Java 虚拟机中。本文首先详细介绍了 Java 类加载器的基本概念,包括代理模型、加载类的具体过程和线程上下文类加载器等。然后介绍了如何开发自己的类加载器,最后介绍了类加载器在 Web 容器和 OSGi™ 中的应用。 类加载器是 Java 语言的一项创新,也是 Java 语言广受欢迎的重要原因之一。它允许将 Java 类动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 开始出现,最初是为了满足 Java Applets 的需求而开发的,Java Applets 需要从远程位置下载 Java 类文件并在浏览器中执行。现在,类加载器已广泛应用于网络容器和 OSGi。一般来说,Java 应用程序的开发人员不需要直接与类加载器交互;Java 虚拟机的默认行为足以应对大多数情况。但是,如果遇到需要与类加载器交互的情况,而您又不太了解类加载器的机制,就很容易花费大量时间调试异常,如 ClassNotFoundException 和 NoClassDefFoundError。本文将详细介绍 Java 的类加载器,帮助读者深入理解 Java 语言中的这一重要概念。下面先介绍一些基本概念。 类加载器的基本概念 顾名思义,类加载器用于将 Java 类加载到 Java 虚拟机中。一般来说,Java 虚拟机以如下方式使用 Java 类:Java 源程序(.java 文件)经 Java 编译器编译后转换为 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码并将其转换为 java.lang 实例。每个实例都用来表示一个 Java 类。通过该实例的 newInstance 方法创建该类的对象。实际情况可能更加复杂,例如,Java 字节代码可能是由工具动态生成或通过网络下载的。 基本上,所有类加载器都是 java.lang.ClassLoader 类的实例。下面将详细介绍这个 Java 类。 java.lang.ClassLoader 类简介 java.lang.ClassLoader 类的基本职责是根据给定类的名称为其查找或生成相应的字节码,然后根据这些字节码定义一个 Java 类,即 java.lang.Class 类的实例。除此之外,ClassLoader 还负责加载 Java 应用程序所需的资源,如图像文件和配置文件。不过,本文只讨论它加载类的功能。为了履行加载类的职责,ClassLoader 提供了许多方法,其中比较重要的方法如表 1 所示。下文将详细介绍这些方法。 表 1.与加载类相关的 ClassLoader 方法
-
MAX_LEN) {
int pivot = partition(arr, left, right);
quicksort_optimized(arr, left, pivot - 1);
quicksort_optimized(arr, pivot + 1, right);
} else {
// 使用插入排序处理小数组
}
}
```
- 合并相同值进行分割:在每次划分后,我们将与枢轴相等的元素聚集在一起,以降低后续迭代中的重复处理。例如:
原序列: 1 4 6 7 6 6 7 6 8 6
- 选取枢轴(6)并划分:1 4 6 7 1 6 7 6 8 6
- 划分结果(未处理相等项):1 4 6 6 7 6 7 6 8 6
- 处理相等项后的划分结果:1 4 6 6 6 6 7 8 7
- 下次划分得到的子序列:1 4 和 7 8 7
通过这样的优化,我们可以明显减少迭代次数,从而提高排序效率。">
改进版快速排序:针对部分有序列的策略与优化技巧" - 随机选枢轴:当数据部分有序时,传统快速排序通过固定枢轴可能导致效率低下。为此,我们采用随机选取枢轴的方法,代码如下: ```c int SelectPivotRandom(int arr[], int low, int high) { srand(time(0)); int pivotPos = (rand() % (high - low)) + low; swap(arr[pivotPos], arr[low]); return arr[low]; } ``` - 优化小数组交换:针对小且部分有序的数组,快速排序不如插入排序高效。因此,当待排序序列长度小于等于10时,我们会切换至插入排序: ```c #define MAX_LEN 10 void quicksort_optimized(int *arr, int left, int right) { int length = right - left; if (length > MAX_LEN) { int pivot = partition(arr, left, right); quicksort_optimized(arr, left, pivot - 1); quicksort_optimized(arr, pivot + 1, right); } else { // 使用插入排序处理小数组 } } ``` - 合并相同值进行分割:在每次划分后,我们将与枢轴相等的元素聚集在一起,以降低后续迭代中的重复处理。例如: 原序列: 1 4 6 7 6 6 7 6 8 6 - 选取枢轴(6)并划分:1 4 6 7 1 6 7 6 8 6 - 划分结果(未处理相等项):1 4 6 6 7 6 7 6 8 6 - 处理相等项后的划分结果:1 4 6 6 6 6 7 8 7 - 下次划分得到的子序列:1 4 和 7 8 7 通过这样的优化,我们可以明显减少迭代次数,从而提高排序效率。
-
在C++中,如何移除整个数组或单个数组元素的方法
-
如何在Java中快速创建一个3x3的二维数组,填充数据,按行显示内容,然后计算并输出所有元素的总和
-
如何在Java中快速创建一个3行4列的矩阵,并通过逐步从键盘获取输入,实现周围元素置零的代码操作
-
在Java中如何随机选取指定范围内的不重复的n个数?
-
简易教程:JavaScript如何快速移除数组中的重复元素
-
如何将Java中的JSON对象转换为包含转义字符的 JSON字符串 (嵌套情况)