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集合重新转换为ListStream流的形式即可,具体实现代码如下:

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);
    }
}

相关文章
|
4月前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
88 5
|
4月前
|
Java 程序员 编译器
Java|如何正确地在遍历 List 时删除元素
从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
84 3
|
4月前
|
Java 程序员
Java|List.subList 踩坑小记
不应该仅凭印象和猜测,就开始使用一个方法,至少花一分钟认真读完它的官方注释文档。
46 1
|
3月前
|
NoSQL Java Redis
List集合按照由小到大排序或者由大到小排序
List集合按照由小到大排序或者由大到小排序
59 0
|
4月前
|
存储 分布式计算 NoSQL
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
43 3
|
5月前
|
NoSQL Java Redis
List集合按照由小到大排序或者由大到小排序
List集合按照由小到大排序或者由大到小排序
34 3
|
9月前
|
存储 安全 Java
24、使用 Java 官方教程学习:① 类变量和类方法详解;② 深入介绍 main() 方法
24、使用 Java 官方教程学习:① 类变量和类方法详解;② 深入介绍 main() 方法
110 1
|
9月前
|
存储 Java
【JAVA学习之路 | 进阶篇】Map接口及其实现类及常用方法
【JAVA学习之路 | 进阶篇】Map接口及其实现类及常用方法
|
9月前
|
Java 测试技术 C++
【JAVA学习之路 | 进阶篇】File类及常用方法
【JAVA学习之路 | 进阶篇】File类及常用方法
|
9月前
|
Java
【JAVA学习之路 | 进阶篇】方法引用与构造器引用
【JAVA学习之路 | 进阶篇】方法引用与构造器引用