List 去重的 6 种方法_list去重方法-程序员宅基地

技术标签: list  数据结构  

方法1:contains判断去重(有序)

要进行数据去重,我们首先想到的是新建一个集合,然后循环原来的集合,每次循环判断原集合中的循环项,如果当前循环的数据,没有在新集合中存在就插入,已经存在了就舍弃,这样当循环执行完,我们就得到了一个没有重复元素的集合了,实现代码如下:

public class ListController {
    

    public static void main(String[] args) {
    
        List<Integer> list = new ArrayList<Integer>() {
    {
    
            add(1);
            add(2);
            add(5);
            add(4);
            add(5);
            add(3);
            add(7);
            add(8);
            add(9);
            add(8);
            add(5);
            add(4);
            add(5);
            add(6);
        }};
        System.out.println("原集合:" + list);
        ListMethod(list);
    }

    /**
     * 使用迭代器去重
     *
     * @param list
     */
    public static void ListMethod(List<Integer> list) {
    
        // 新集合
        List<Integer> newList = new ArrayList<>(list.size());
        list.forEach(i -> {
    
            if (!newList.contains(i)) {
     
                // 如果新集合中不存在则插入
                newList.add(i);
            }
        });
        System.out.println("去重集合:" + newList);
    }
}

以上程序执行的结果,如下所示:
在这里插入图片描述

此方法的优点的:理解起来比较简单,并且最终得到的集合也是有序的,这里的有序指的是新集合的排列顺序和原集合的顺序是一致的;但缺点是实现代码有点多,不够简洁优雅。

方法2:迭代器去重(无序)

自定义 List 去重,除了上面的新建集合之外,我们也可以使用迭代器循环判断每一项数据,如果当前循环的数据,在集合中存在两份或两份以上,就将当前的元素删除掉,这样循环完之后,也可以得到一个没有重复数据的集合,实现代码如下:

public class ListController {
    

    public static void main(String[] args) {
    
        List<Integer> list = new ArrayList<Integer>() {
    {
    
            add(1);
            add(2);
            add(5);
            add(4);
            add(5);
            add(3);
            add(7);
            add(8);
            add(9);
            add(8);
            add(5);
            add(4);
            add(5);
            add(6);
        }};
        System.out.println("原集合:" + list);
        ListMethod(list);
    }

    /**
     * 使用迭代器去重
     *
     * @param list
     */
    public static void ListMethod(List<Integer> list) {
    
       Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()) {
    
            // 获取循环的值
            Integer item = iterator.next();
            // 如果存在两个相同的值
            if (list.indexOf(item) != list.lastIndexOf(item)) {
    
                // 移除最后那个相同的值
                iterator.remove();
            }
        }
        System.out.println("去重集合:" + list);
    }
}

以上程序执行的结果,如下所示:
在这里插入图片描述
此方法的实现比上一种方法的实现代码要少一些,并且不需要新建集合,但此方法得到的新集合是无序的,也就是新集合的排列顺序和原集合不一致,因此也不是最优的解决方案。

方法3:HashSet去重(无序)

我们知道 HashSet 天生具备“去重”的特性,那我们只需要将 List 集合转换成 HashSet 集合就可以了,实现代码如下:

public class ListController {
    

    public static void main(String[] args) {
    
        List<Integer> list = new ArrayList<Integer>() {
    {
    
            add(1);
            add(2);
            add(5);
            add(4);
            add(5);
            add(3);
            add(7);
            add(8);
            add(9);
            add(8);
            add(5);
            add(4);
            add(5);
            add(6);
        }};
        System.out.println("原集合:" + list);
        ListMethod(list);
    }

    /**
     * 使用 HashSet 去重
     * @param list
     */
    public static void ListMethod(List<Integer> list) {
    
        HashSet<Integer> set = new HashSet<>(list);
        System.out.println("去重集合:" + set);
    }
}

以上程序执行的结果,如下所示:
在这里插入图片描述
此方法的实现代码较为简洁,但缺点是 HashSet 会自动排序,这样新集合的数据排序就和原集合不一致了,如果对集合的顺序有要求,那么此方法也不能满足当前需求。

方法4:LinkedHashSet去重(有序)

既然 HashSet 会自动排序不能满足需求,那就使用 LinkedHashSet,它既能去重又能保证集合的顺序,实现代码如下:

public class ListController {
    

    public static void main(String[] args) {
    
        List<Integer> list = new ArrayList<Integer>() {
    {
    
            add(1);
            add(2);
            add(5);
            add(4);
            add(5);
            add(3);
            add(7);
            add(8);
            add(9);
            add(8);
            add(5);
            add(4);
            add(5);
            add(6);
        }};
        System.out.println("原集合:" + list);
        ListMethod(list);
    }

    /**
     * 使用 LinkedHashSet 去重
     * @param list
     */
    public static void ListMethod(List<Integer> list) {
    
        LinkedHashSet<Integer> set = new LinkedHashSet<>(list);
        System.out.println("去重集合:" + set);
    }
}

以上程序执行的结果,如下所示:
在这里插入图片描述
从上述代码和执行结果可以看出,LinkedHashSet 是到目前为止,实现比较简单,且最终生成的新集合与原集合顺序保持一致的实现方法,是我们可以考虑使用的一种去重方法。

方法5:TreeSet去重(无序)

除了以上的 Set 集合之外,我们还可以使用 TreeSet 集合来实现去重功能,实现代码如下:

public class ListController {
    

    public static void main(String[] args) {
    
        List<Integer> list = new ArrayList<Integer>() {
    {
    
            add(1);
            add(2);
            add(5);
            add(4);
            add(5);
            add(3);
            add(7);
            add(8);
            add(9);
            add(8);
            add(5);
            add(4);
            add(5);
            add(6);
        }};
        System.out.println("原集合:" + list);
        ListMethod(list);
    }

    /**
     * 使用 TreeSet 去重(无序)
     * @param list
     */
    public static void ListMethod(List<Integer> list) {
    
        TreeSet<Integer> set = new TreeSet<>(list);
        System.out.println("去重集合:" + set);
    }
}

以上程序执行的结果,如下所示:
在这里插入图片描述
比较遗憾的是,TreeSet 虽然实现起来也比较简单,但它有着和 HashSet 一样的问题,会自动排序,因此也不能满足我们的需求。

方法6:Stream去重(有序)

JDK 8 为我们带来了一个非常实用的方法 Stream,使用它可以实现很多功能,比如下面的去重功能:

public class ListController {
    

    public static void main(String[] args) {
    
        List<Integer> list = new ArrayList<Integer>() {
    {
    
            add(1);
            add(2);
            add(5);
            add(4);
            add(5);
            add(3);
            add(7);
            add(8);
            add(9);
            add(8);
            add(5);
            add(4);
            add(5);
            add(6);
        }};
        System.out.println("原集合:" + list);
        ListMethod(list);
    }

    /**
     * 使用 Stream 去重
     * @param list
     */
    public static void ListMethod(List<Integer> list) {
    
        list = list.stream().distinct().collect(Collectors.toList());
        System.out.println("去重集合:" + list);
    }
}

以上程序执行的结果,如下所示:
在这里插入图片描述
Stream 实现去重功能和其他方法不同的是,它不用新创建集合,使用自身接收一个去重的结果就可以了,并且实现代码也很简洁,并且去重后的集合顺序也和原集合的顺序保持一致,是我们最优先考虑的去重方法。

补充: 在我们常见的集合类型中,有序的有ArrayList,LinkedList,LinkedHashSet,LinkedHashMap等,无序的有HashSet,HashMap,HashTable,TreeSet,TreeMap等,而同时TressSet和TressMap又是可排序的。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42116127/article/details/122140137

智能推荐

联想拯救者y7000键盘有几个按键失灵_y7000p键盘失灵-程序员宅基地

文章浏览阅读1.2w次。以联想拯救者y7000p为例,键盘失灵是系统有问题,联想笔记本都带着一键还原功能,只要没有重新安装过系统。一键还原按钮在笔记本左侧或者右侧,是一个很细的孔,进行还原系统即可。键盘(Keyboard)是用于操作设备运行的一种指令和数据输入装置,也指经过系统安排操作一台机器或设备的一组功能键。键盘是最常用也是最主要的输入设备,通过键盘可以将英文字母、数字、标点符号等输入到计算机中,从而向计算机发出命令..._联想拯救者y7000 2022款键盘失灵

贤胜足球分析系统 v2.4.4 大小球测试版 怎么用-程序员宅基地

文章浏览阅读4.7k次。Welcome to my blog!贤胜足球分析系统 v2.4.4 大小球测试版 软件大小:29823 KB软件语言:简体中文软件类别:国产软件 / 免费版 / 彩票工具应用平台:Win9x/NT/2000/XP/2003界面预览:无插件情况: 投诉更新时间:2007-02-01 14:00:24下载次数:1231推荐等级:联 系 人:haiyuwebc_足球分析系统

Python3 LinAlgError: SVD did not converge in Linear Least Squares-程序员宅基地

文章浏览阅读8.5k次,点赞6次,收藏5次。有用的话记得回过头请给本文点个赞,感谢您的支持!LinAlgError: SVD did not converge in Linear Least Squares说明在拟合时,y值里存在nan值,ps:虽然你的原始文件中可能没有nan值,但是可能存在数值类型不是float型或完全的整型的数据,导致读出来的数据中有nan值,我就遇到一个,如图,读出来有一个是nan值,原始文件中是一个float型数字。解决方法,去掉该数据。y = lsit(y)nan_index = []for i in r_svd did not converge in linear least squares

CGI编程学习5 穿插HTML,CSS零星知识-程序员宅基地

文章浏览阅读127次。今天,看了同学写的HTML代码很糟糕.就自己重写了一下.了解了一些HTML.CSS知识.现记录在这里.先给大家一个比较好的CSS教程网站:http://www.w3school.com.cn/css/index.aspCSS 概述CSS 指层叠样式表 (Cascading Style Sheets)样式定义如何显示 HTML 元素样式通常存储在样式表中把样式添加..._cgi 生成含有css的html文件

【5G RRC】Master Information Block (NR-MIB)_mib rlc-程序员宅基地

文章浏览阅读2k次,点赞3次,收藏11次。- MIB通过BCH传输信道和PBCH物理信道传输;- QPSK调制;- 它包含了解码 *SystemInformationBlockType1 (SIB1)* 所需的必要参数;- 它的传输周期为80毫秒,在这80毫秒内进行重复传输;- 它在OFDM 的符号1、2、3上传输;- 根据TS 38.211,它在符号1和3上使用0~239的子载波号,而在符号2上,使用0\~47的子载波号和192\~239的子载波号;_mib rlc

连接Oracle数据库时遇到:Listener refused the connection with the following error。。。。_oracle.net.ns.netexception: listener refused the c-程序员宅基地

文章浏览阅读3.8w次。今天在对原来的项目进行运行时,突然程序报出java.sql.SQLException: Listener refused the connection with the following error:ORA-12519, TNS:no appropriate service handler found 这个错误,之前一直运行都是好好的,于是乎,就各种查找相关的解决方法,网上查找到的原_oracle.net.ns.netexception: listener refused the connection with the followi

随便推点

ovn:最简单的ovn分布式网关实现Demo_ovn lb配置在router上测试-程序员宅基地

文章浏览阅读956次。465efd10-c0e0-4966-be32-a20b213a2dbc 为 ha1 的uuid,可通过 ovn-nbctl ha-chassis-group-list 查看。#问题网关节点设置的ip不通,是因为路由器的网关接口mac与外部逻辑交换机的路由器端口mac地址不符。#==创建ovs端口=========================#==创建外部网络网桥================#经排查是未设置ls2交换机上的路由器端口的mac地址。#设置地址,必须和 lr1-ls1 的一致。_ovn lb配置在router上测试

【计算机网络】物理层-程序员宅基地

文章浏览阅读1.1k次,点赞16次,收藏9次。物理层解决如何在连接各种计算机的传输媒体上传输数据比特流,而不是具体的传输媒体。物理层主要任务:确定与传输媒体接口有关的一些特性 =》定义标准。通信的目的是传送消息(消息:语音、文字、图像、视频等)。说明:数据通信指在不同计算机之间传输表示信息的二进制数0、1序列的过程。数据data:传送信息的实体,通常是有意义的符号序列。信号:数据的电气/电磁的变现,是数据在传输过程中的存在形式。信源:产生和发送数据的源头。信宿: 接收数据的终点。信道:信号的传输媒介。一般用来表示向某一个方向传送信息的介质,因此一条通信

C#WinForm 打包和部署 -结束篇_vs winform 项目打包 怎么把python打进去-程序员宅基地

文章浏览阅读1k次。1.打开 VS 创建一个 安装项目,如下图:创建成功后,如下图: 2.安装项目的 文件夹介绍及其使用A.应用程序文件夹 : 主要功能,存储需要打包,执行程序,以及资源文件。B.用户的“程序”菜单 :主要功能,左下角windows 快捷方式 存放的地方 C.用户桌面 : 主要功能,用户机器 桌面的快捷方式 存放的地方 3.操作步骤1.配置应用程序文件夹 2.配置应用程序菜单A.添加文件的方法_vs winform 项目打包 怎么把python打进去

FPGA面试真题解析_fpga二进制编码为啥用较多组合逻辑-程序员宅基地

文章浏览阅读2.4k次,点赞2次,收藏30次。FPGA面试真题解析1、1、 十进制46.25对应的二进制表达式为( )。(硬件逻辑实习岗)A 101110.11 B 101101.01 C 101110.1 D 101110.01解析:这个问题看上去很简单,那是因为我们平时可以打开电脑上的计算器,然后用程序员功能立刻就能出结果,但是笔试的时候我们并不能使用这种“作弊“的功能,所以还是要会手算。可能很多同学数电是大一大二时学习的,很久没有接触过这么基础的问题了,那就让我们一起来回忆下吧。首先这个题_fpga二进制编码为啥用较多组合逻辑

Oracle之sql标准之增删查改子句用法_oracle删除语句带子查询 原理-程序员宅基地

文章浏览阅读1k次。SELECT语句 SELECT [ ALL | DISTINCT { * | expression | column1_name [ , column2_name ] [ , … ] }FROM { table1_name | ( subquery ) } [ alias ][ , { table2_name | ( subquery ) } [ alias ] , … ][ _oracle删除语句带子查询 原理

EPLAN2022——端子_eplan端子排-程序员宅基地

文章浏览阅读7k次,点赞4次,收藏16次。插入——端子——点击端子。选择端子,没别插入到图纸中;勾选多层端子,输入端子层数量;将X5和X6连个端子合并为一个端子排;不同行/列,生成多个端子排;选中端子,可以拖放插入,也可以单个放置;默认端子如果不是想插入的端子,按退格键选择;设备——端子——导航器。或者使用3连接点的端子和4连接点的端子组合;通常选择带鞍型跳线的端子,2个连接点;双击X6——将完整设备标识符修改为X5:2;X5端子排的第二个;已使用端子和未使用端子,端子前的购物车符号不同;如果放置在同一列/行,自动生成为同一个端子排;_eplan端子排