如何从 Java 中的 ArrayList 中删除重复的员工对象?

简介: 【8月更文挑战第23天】

简介

ArrayList 是 Java 中一个常用的集合框架类,用于存储元素的列表。有时,我们可能需要从 ArrayList 中删除重复的元素,例如员工对象。以下是实现此功能的详细步骤:

1. 使用 HashSet

HashSet 是一个不包含重复元素的集合。我们可以使用 HashSet 来存储 ArrayList 中的员工对象。然后,我们可以遍历 ArrayList 并检查每个员工对象是否已经存在于 HashSet 中。如果员工对象不存在,则将其添加到 HashSet 中。如果员工对象已经存在,则表示它是一个重复值,我们可以从 ArrayList 中删除它。

示例:

import java.util.ArrayList;
import java.util.HashSet;

public class Example {
   
    public static void main(String[] args) {
   
        ArrayList<Employee> list = new ArrayList<>();
        list.add(new Employee(1, "John"));
        list.add(new Employee(2, "Mary"));
        list.add(new Employee(3, "Bob"));
        list.add(new Employee(1, "John"));  // duplicate

        HashSet<Employee> set = new HashSet<>();

        for (Employee employee : list) {
   
            if (!set.add(employee)) {
   
                list.remove(employee);
            }
        }

        System.out.println(list);  // 输出:[Employee(id=1, name=John), Employee(id=2, name=Mary), Employee(id=3, name=Bob)]
    }
}

class Employee {
   
    private int id;
    private String name;

    public Employee(int id, String name) {
   
        this.id = id;
        this.name = name;
    }

    // Override equals() and hashCode() methods for comparison
    @Override
    public boolean equals(Object obj) {
   
        if (obj instanceof Employee) {
   
            Employee other = (Employee) obj;
            return this.id == other.id && this.name.equals(other.name);
        }
        return false;
    }

    @Override
    public int hashCode() {
   
        return Objects.hash(id, name);
    }

    @Override
    public String toString() {
   
        return "Employee(id=" + id + ", name=" + name + ")";
    }
}

2. 使用 Collections.sort() 和 Collections.unique() 方法

我们可以使用 Collections.sort() 方法对 ArrayList 进行排序,然后使用 Collections.unique() 方法删除重复元素。Collections.unique() 方法返回一个新的 ArrayList,其中包含唯一元素。

示例:

import java.util.ArrayList;
import java.util.Collections;

public class Example {
   
    public static void main(String[] args) {
   
        ArrayList<Employee> list = new ArrayList<>();
        list.add(new Employee(1, "John"));
        list.add(new Employee(2, "Mary"));
        list.add(new Employee(3, "Bob"));
        list.add(new Employee(1, "John"));  // duplicate

        Collections.sort(list);
        ArrayList<Employee> uniqueList = new ArrayList<>(Collections.unique(list));

        System.out.println(uniqueList);  // 输出:[Employee(id=1, name=John), Employee(id=2, name=Mary), Employee(id=3, name=Bob)]
    }
}

3. 使用 Stream API

Java 8 及更高版本提供了 Stream API,我们可以使用它来删除重复的员工对象。我们可以使用 distinct() 方法对 Stream 进行过滤,该方法返回一个新的 Stream,其中包含唯一元素。

示例:

import java.util.ArrayList;
import java.util.stream.Collectors;

public class Example {
   
    public static void main(String[] args) {
   
        ArrayList<Employee> list = new ArrayList<>();
        list.add(new Employee(1, "John"));
        list.add(new Employee(2, "Mary"));
        list.add(new Employee(3, "Bob"));
        list.add(new Employee(1, "John"));  // duplicate

        ArrayList<Employee> uniqueList = list.stream()
                .distinct()
                .collect(Collectors.toList());

        System.out.println(uniqueList);  // 输出:[Employee(id=1, name=John), Employee(id=2, name=Mary), Employee(id=3, name=Bob)]
    }
}

结论

有三种方法可以从 Java 中的 ArrayList 中删除重复的员工对象:

  • 使用 HashSet
  • 使用 Collections.sort() 和 Collections.unique() 方法
  • 使用 Stream API

选择哪种方法取决于所需的功能、性能和代码简洁性。

目录
相关文章
|
5天前
|
存储 Java
java的对象详解
在Java中,对象是根据类模板实例化的内存实体,具有唯一标识符、属性及行为。通过`new`关键字实例化对象并用构造方法初始化。变量存储的是对象引用而非对象本身,属性描述对象状态,方法定义其行为。Java利用垃圾回收机制自动处理不再使用的对象内存回收,极大地简化了对象生命周期管理,同时对象具备封装、继承和多态性,促进了代码的重用与模块化设计。这使得Java程序更易于理解、维护和扩展。
|
2天前
|
存储 Java
Java的对象和类的相同之处和不同之处
在 Java 中,对象和类是面向对象编程的核心。
|
1天前
|
存储 Java
Java编程中的对象序列化与反序列化
【9月更文挑战第12天】在Java的世界里,对象序列化与反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何通过实现Serializable接口来标记一个类的对象可以被序列化,并探索ObjectOutputStream和ObjectInputStream类的使用,以实现对象的写入和读取。我们还将讨论序列化过程中可能遇到的问题及其解决方案,确保你能够高效、安全地处理对象序列化。
|
7天前
|
Java
Java 对象和类
在Java中,**类**(Class)和**对象**(Object)是面向对象编程的基础。类是创建对象的模板,定义了属性和方法;对象是类的实例,通过`new`关键字创建,具有类定义的属性和行为。例如,`Animal`类定义了`name`和`age`属性及`eat()`、`sleep()`方法;通过`new Animal()`创建的`myAnimal`对象即可调用这些方法。面向对象编程通过类和对象模拟现实世界的实体及其关系,实现问题的结构化解决。
|
10天前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
|
17天前
|
存储 Java
Java中ArrayList 元素的排序
本文提供了Java中根据`ArrayList`元素的某个属性进行排序的示例代码,包括实现`Comparable`接口和重载`compareTo`方法,然后使用`Collections.sort`方法进行排序。
|
17天前
|
存储 Java
Java编程中的对象序列化与反序列化
【8月更文挑战第28天】在Java世界中,对象序列化与反序列化是数据持久化和网络传输的关键技术。本文将深入浅出地探讨这一过程,带你领略其背后的原理及应用,让你的程序在数据的海洋中自由航行。
|
4天前
|
Java 程序员
Java编程中的对象和类: 初学者指南
【9月更文挑战第9天】在Java的世界中,对象和类构成了编程的基石。本文将引导你理解这两个概念的本质,并展示如何通过它们来构建你的程序。我们将一起探索类的定义,对象的创建,以及它们如何互动。准备好了吗?让我们开始这段Java的旅程吧!
|
11天前
|
存储 Java
Java编程中的对象序列化与反序列化
【9月更文挑战第2天】在Java的世界里,对象序列化和反序列化就像是给数据穿上了一件隐形的斗篷。它们让数据能够轻松地穿梭于不同的系统之间,无论是跨越网络还是存储在磁盘上。本文将揭开这层神秘的面纱,带你领略序列化和反序列化的魔法,并展示如何通过代码示例来施展这一魔法。
13 0
|
14天前
|
存储 Java
Java编程中的对象和类
在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章【8月更文挑战第31天】 将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!