,,汇总Java中List 去重的 6 种方法

,,汇总Java中List 去重的 6 种方法

本文主要介绍Java中总结列表去重的六种方法。文章重点介绍了列表去重法的主题,有一定的参考价值,有需要的朋友可以参考一下。

目录

预知无序集有序集有序与无序方法1:包含判断方法2:迭代器方法3: hashset方法4:链接hashset方法5: treeset方法6: stream方法00

在日常业务开发中,偶尔会有需要从列表集中删除重复数据的场景。这时候可能会有同学问:为什么不直接用Set或者LinkedHashSet呢?不存在数据重复的问题吗?

不得不说,能问出这个问题的同学都很机智,一眼就看出了问题的本质。

但实际业务开展中遇到的情况会更复杂。比如列表集可能是历史遗留问题,也可能是调用接口返回的类型限制,只能用列表接收,或者代码写了一半,多集合并时才发现这个问题。总之问题的原因很多,这里就不一一列举了。

发现这个问题后,如果可以修改原代码,用集合类型替换原列表类型,就可以直接修改集合的类型。但是如果根本修改不了,或者修改成本太大,那么下面的六种减肥方法会帮你解决问题。

前置知识

在开始之前,我们先了解两组概念:前言:。因为在接下来的方法实现中会反复提到这两组概念,所以在正式开始之前有必要把它们说清楚。

无序集合

集合无序是指数据读取的顺序与数据插入的顺序不一致。比如插入集合的顺序是:1,5,3,7,但是读取集合的顺序是:1,3,5,7。

有序集合

有序集的概念正好和无序集相反,也就是说集合的读取顺序和插入顺序是一样的。比如插入数据的顺序是:1,5,3,7,那么读取的顺序也是:1,5,3,7。

有序和无序

通过上面的无序集和有序集,我们可以得到有序和无序的概念。有序性是指数据按照我们的预期排列和读取的顺序,称为有序性。无序是指数据的排列顺序和阅读顺序不符合我们的预期,称为无序。

PS:有序和无序的概念不清楚也没关系。通过下面的例子,我们可以进一步理解它们的含义。

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

要消除重复数据,我们首先想到的是创建一个新集,然后循环原始集。每个循环判断原始集合中的循环项目。如果当前的循环数据不在新的集合中,插入它,如果它已经存在,丢弃它,这样当循环结束时,我们将得到一个没有重复元素的集合,无序集合和有序集合 无序和有序

公共类ListDistinctExample {

公共静态void main(String[] args) {

list integer list=new ArrayListInteger(){ {

添加(1);

增加(3);

增加(5);

添加(2);

添加(1);

增加(3);

增加(7);

添加(2);

}};

System.out.println('原始集:'列表');

方法(列表);

}

/**

*自定义重复数据删除

* @param list

*/

公共静态void方法(ListInteger list) {

//新集合

list integer new list=new ArrayList(list . size());

list.forEach(i - {

如果(!list . contains(I)){//如果它不在新集合中,则插入

new list . add(I);

}

});

System.out.println('重复数据删除集:' new list ');

}

}

实现代码如下:

这种方法的优点是:简单易懂,最终集合也是有序的,其中新集合的顺序与原集合的顺序相同;但缺点是实现代码有点多,不够简洁优雅。

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

自定义列表去重,除了上面的新集合,我们还可以用迭代器循环判断每一项数据。如果集合中当前循环有两条或多条数据,当前元素将被删除,这样在循环后,我们也可以得到一个没有重复数据的集合。

以上程序执行的结果,如下所示:

公共类ListDistinctExample {

公共静态void main(String[] args) {

list integer list=new ArrayListInteger(){ {

添加(1);

增加(3);

增加(5);

添加(2);

添加(1);

增加(3);

增加(7);

添加(2);

}};

System.out.println('原始集:'列表');

method_1(列表);

}

/**

*使用迭代器进行复制。

* @param list

*/

public static void method _ 1(list integer list){

iterator integer iterator=list . iterator();

while (iterator.hasNext()) {

//获取循环的值

整数item=iterator . next();

//如果有两个相同的值

if (list.indexOf(item)!=list.lastIndexOf(item)) {

//删除最后一个相同的值

iterator . remove();

}

}

System.out.println('重复数据删除集:'列表');

}

}

实现代码如下:

这种方法的实现比前面的方法少,不需要创建新的集合。但这种方法得到的新集合是无序的,即新集合的顺序与原集合不一致,因此不是最优解。

方法3:HashSet去重(无序)

我们知道HashSet天生就有“去重”的特性,所以我们只需要把链表集合转换成HashSet集合。

以上程序执行的结果,如下所示:

公共类ListDistinctExample {

公共静态void main(String[] args) {

list integer list=new ArrayListInteger(){ {

添加(1);

增加(3);

增加(5);

添加(2);

添加(1);

增加(3);

增加(7);

添加(2);

}};

System.out.println('原始集:'列表');

方法_2(列表);

}

/**

*使用HashSet移除重量。

* @param list

*/

public static void method _ 2(list integer list){

HashSetInteger set=new HashSet(list);

System.out.println('重复数据删除集:'集');

}

}

实现代码如下:

这种方法实现代码简单,但缺点是HashSet会自动排序,这样新集合的数据排序与原集合不一致。如果对集合的顺序有要求,那么这种方法不能满足当前的需求。

方法4:LinkedHashSet去重(有序)

由于HashSet可以自动排序,不能满足需求,所以使用LinkedHashSet,既能消除重复又能保证集合的顺序,以上程序执行的结果,如下所示:

公共类ListDistinctExample {

公共静态void main(String[] args) {

list integer list=new ArrayListInteger(){ {

添加(1);

增加(3);

增加(5);

添加(2);

添加(1);

增加(3);

增加(7);

添加(2);

}};

System.out.println('原始集:'列表');

方法_3(列表);

}

/**

*使用LinkedHashSet移除重量。

* @param list

*/

public static void method _ 3(list integer list){

LinkedHashSetInteger set=new LinkedHashSet(list);

System.out.println('重复数据删除集:'集');

}

}

实现代码如下:

从上面的代码和执行结果可以看出,LinkedHashSet是目前为止比较简单的实现方法,最终生成的新集合与原集合的顺序相同。这是一种我们可以考虑使用的重复数据消除方法。

方法5:TreeSet去重(无序)

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

公共类ListDistinctExample {

公共静态void main(String[] args) {

list integer list=new ArrayListInteger(){ {

添加(1);

增加(3);

增加(5);

添加(2);

添加(1);

增加(3);

增加(7);

添加(2);

}};

System.out.println('原始集:'列表');

方法_4(列表);

}

/**

*使用树集复制(无序)

* @param list

*/

public static void method _ 4(list integer list){

TreeSet integer set=new TreeSet(list);

System.out.println('重复数据删除集:'集');

}

}

以上程序执行的结果,如下所示:

遗憾的是,虽然TreeSet实现起来相对简单,但是它和HashSet有着同样的问题,而且可以自动排序,所以不能满足我们的需求。

方法6:Stream去重(有序)

JDK 8给我们带来了一个非常实用的方法流,可以实现很多功能。

以上程序执行的结果,如下所示:

公共类ListDistinctExample {

公共静态void main(String[] args) {

list integer list=new ArrayListInteger(){ {

添加(1);

增加(3);

增加(5);

添加(2);

添加(1);

增加(3);

增加(7);

添加(2);

}};

System.out.println('原始集:'列表');

方法_5(列表);

}

/**

*使用流进行复制

* @param list

*/

public static void method _ 5(list integer list){

list=list.stream()。独特()。collect(collectors . to list());

System.out.println('重复数据删除集:'列表');

}

}

比如下面的去重功能:

实现Stream的去重功能与其他方法的区别在于,它不需要创建新的集合,只需要自己接收一个去重结果。而且实现代码也很简洁,去重后集合的顺序和原集合一致,是我们优先级最高的去重方法。

总结

本文介绍了六套去重方法,其中实现最简单,去重后的顺序可以和原套一致。只有两种方法:LinkedHashSet去重和Stream去重,后一种去重方法不需要借助新的Set,这是我们优先考虑的。

关于总结Java中列表去重的六种方法的这篇文章到此为止。有关重复数据消除的更多相关内容,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: