Java集合相关学习——如何实现List集合的去重操作?

简介: Java集合相关学习——如何实现List集合的去重操作?

废话就不多说了,直接开始上代码:👇👇👇


1.方法一


首先我们可以创建一个新的List集合,通过循环原始的List集合判断循环的元素,是否已存在于新集合,如果不存在则插入,否则就忽略,这样循环完,最终得到的新集合就是一个没有重复元素的集合,具体实现代码如下:

import java.util.ArrayList;
import java.util.List;
/**
 *
 */
public class DistinctList1 {
    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        list.add(new Person("张起灵", 18));
        list.add(new Person("小哥", 20));
        list.add(new Person("闷油瓶", 22));
        list.add(new Person("小哥", 20));
        //去重操作
        List<Person> personList = new ArrayList<>(list.size());
        list.forEach(p -> {
            if (!personList.contains(p)) {
                personList.add(p);
            }
        });
        //打印输出
        personList.forEach(System.out::println);
    }
}

2.方法二


使用迭代器循环并判断当前元素首次出现的位置(indexOf)是否等于最后出现的位置(lastIndexOf),如果不等于则说明此元素为重复元素,删除当前元素即可,这样循环完就能得到一个没有重复元素的集合,实现代码如下:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
 *
 */
public class DistinctList2 {
    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        list.add(new Person("张起灵", 18));
        list.add(new Person("小哥", 20));
        list.add(new Person("闷油瓶", 22));
        list.add(new Person("小哥", 20));
        //去重操作
        //获取List集合对应的迭代器
        Iterator<Person> iterator = list.iterator();
        while (iterator.hasNext()) {
            //获取当前迭代器指针所指向的元素
            Person person = iterator.next();
            //如果该person在list集合中第一次出现的下标 不等于 最后一次出现的下标,则表明重复
            //如果该person在list集合中只出现了一次,那么第一次出现的下标肯定就是最后一次出现的下标了
            if (list.indexOf(person) != list.lastIndexOf(person)) {
                iterator.remove();
            }
        }
        //打印输出
        list.forEach(System.out::println);
    }
}

3.方法三


Set集合天生具备去重特性,在创建 Set 集合时可以传递一个 List 集合,这样就能实现数据转移和去重的功能了,具体实现代码如下:

import java.util.*;
/**
 *
 */
public class DistinctList3 {
    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        list.add(new Person("张起灵", 18));
        list.add(new Person("小哥", 20));
        list.add(new Person("闷油瓶", 22));
        list.add(new Person("小哥", 20));
        //去重操作
        Set<Person> set = new HashSet<>(list);
//        Set<Person> set = new LinkedHashSet<>(list);
        //打印输出
        set.forEach(System.out::println);
    }
}

4.方法四


最后一种也是最简单的一种去重方式,我们可以使用 JDK 8 中提供的 Stream 进行去重,Stream 中包含了一个去重方法:distinct,可以直接实现集合的去重功能,最终将去重之后的List集合重新转换为List的Stream流的形式即可,具体实现代码如下:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
 *
 */
public class DistinctList4 {
    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        list.add(new Person("张起灵", 18));
        list.add(new Person("小哥", 20));
        list.add(new Person("闷油瓶", 22));
        list.add(new Person("小哥", 20));
        //去重操作
        list = list.stream().distinct().collect(Collectors.toList());
        //打印输出
        list.forEach(System.out::println);
    }
}

相关文章
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
540 1
|
Java API 容器
Java基础学习day08-2
本节讲解Java方法引用与常用API,包括静态、实例、特定类型方法及构造器引用的格式与使用场景,并结合代码示例深入解析。同时介绍String和ArrayList的核心方法及其实际应用。
300 1
|
12月前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
930 0
|
负载均衡 Java API
grpc-java 架构学习指南
本指南系统解析 grpc-java 架构,涵盖分层设计、核心流程与源码结构,结合实战路径与调试技巧,助你从入门到精通,掌握高性能 RPC 开发精髓。
1080 8
|
存储 Java 索引
(Python基础)新时代语言!一起学习Python吧!(二):字符编码由来;Python字符串、字符串格式化;list集合和tuple元组区别
字符编码 我们要清楚,计算机最开始的表达都是由二进制而来 我们要想通过二进制来表示我们熟知的字符看看以下的变化 例如: 1 的二进制编码为 0000 0001 我们通过A这个字符,让其在计算机内部存储(现如今,A 字符在地址通常表示为65) 现在拿A举例: 在计算机内部 A字符,它本身表示为 65这个数,在计算机底层会转为二进制码 也意味着A字符在底层表示为 1000001 通过这样的字符表示进行转换,逐步发展为拥有127个字符的编码存储到计算机中,这个编码表也被称为ASCII编码。 但随时代变迁,ASCII编码逐渐暴露短板,全球有上百种语言,光是ASCII编码并不能够满足需求
477 4
|
Java
Java基础学习day08-作业
本作业涵盖Java中Lambda表达式的应用,包括Runnable与Comparator接口的简化实现、自定义函数式接口NumberProcessor进行加减乘及最大值操作,以及通过IntProcessor处理整数数组,实现遍历、平方和奇偶判断等功能,强化函数式编程实践。
215 5
|
Java 程序员
Java基础学习day08
本节讲解Java中的代码块(静态与实例)及其作用,深入介绍内部类(成员、静态、局部及匿名)的定义与使用,并引入函数式编程思想,重点阐述Lambda表达式及其在简化匿名内部类中的应用。
303 5
|
安全 Java
java线程之List集合并发安全问题及解决方案
java线程之List集合并发安全问题及解决方案
2355 1
|
运维 关系型数据库 Java
PolarDB产品使用问题之使用List或Range分区表时,Java代码是否需要进行改动
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
Java API Apache
怎么在在 Java 中对List进行分区
本文介绍了如何将列表拆分为给定大小的子列表。尽管标准Java集合API未直接支持此功能,但Guava和Apache Commons Collections提供了相关API。
702 1