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学习最佳实践!
22 3
|
4天前
|
数据采集 安全 Java
Java并发编程学习12-任务取消(上)
【5月更文挑战第6天】本篇介绍了取消策略、线程中断、中断策略 和 响应中断的内容
30 4
Java并发编程学习12-任务取消(上)
|
4天前
|
Java Android开发
java利用xml-rpc协议操作wordpress博客
java利用xml-rpc协议操作wordpress博客
12 1
|
1天前
|
Python
两个list集合合并成一个python教程 - 蓝易云
在这两种方法中,加号会创建一个新的列表,而extend方法则会在原地修改列表。
5 0
|
1天前
|
JavaScript 前端开发 测试技术
《手把手教你》系列技巧篇(四十八)-java+ selenium自动化测试-判断元素是否可操作(详解教程)
【5月更文挑战第12天】本文介绍了WebDriver中用于判断元素状态的三个方法:`isEnabled()`、`isSelected()`和`isDisplayed()`。`isSelected()`检查元素是否被选中,通常用于勾选框。`isDisplayed()`则用来判断元素是否在页面上可见。`isEnabled()`方法确定元素是否可操作,例如是否能点击或输入内容。
8 1
|
3天前
|
NoSQL 算法 Java
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
|
4天前
|
监控 Java
Java一分钟之-NIO:非阻塞IO操作
【5月更文挑战第14天】Java的NIO(New IO)解决了传统BIO在高并发下的低效问题,通过非阻塞方式提高性能。NIO涉及复杂的选择器和缓冲区管理,易出现线程、内存和中断处理的误区。要避免这些问题,可以使用如Netty的NIO库,谨慎设计并发策略,并建立标准异常处理。示例展示了简单NIO服务器,接收连接并发送欢迎消息。理解NIO工作原理和最佳实践,有助于构建高效网络应用。
8 2
|
4天前
|
安全 Java 数据安全/隐私保护
Java一分钟之-Java反射机制:动态操作类与对象
【5月更文挑战第12天】本文介绍了Java反射机制的基本用法,包括获取Class对象、创建对象、访问字段和调用方法。同时,讨论了常见的问题和易错点,如忽略访问权限检查、未捕获异常以及性能损耗,并提供了相应的避免策略。理解反射的工作原理和合理使用有助于提升代码灵活性,但需注意其带来的安全风险和性能影响。
23 4
|
4天前
|
存储 安全 算法
Java一分钟之-Java集合框架入门:List接口与ArrayList
【5月更文挑战第10天】本文介绍了Java集合框架中的`List`接口和`ArrayList`实现类。`List`是有序集合,支持元素重复并能按索引访问。核心方法包括添加、删除、获取和设置元素。`ArrayList`基于动态数组,提供高效随机访问和自动扩容,但非线程安全。文章讨论了三个常见问题:索引越界、遍历时修改集合和并发修改,并给出避免策略。通过示例代码展示了基本操作和安全遍历删除。理解并正确使用`List`和`ArrayList`能提升程序效率和稳定性。
11 0
|
4天前
|
Java API
Java操作elasticsearch
Java操作elasticsearch
11 0