dw做网站怎么发布,养殖企业网站,哪里做网络推广,自己建网站流程要学什么作者 | 王磊来源 | Java中文社群#xff08;ID#xff1a;javacn666#xff09;转载请联系授权#xff08;微信ID#xff1a;GG_Stone#xff09;在日常的业务开发中#xff0c;偶尔会遇到需要将 List 集合中的重复数据去除掉的场景。这个时候可能有同学会问#xff1a… 作者 | 王磊来源 | Java中文社群IDjavacn666转载请联系授权微信IDGG_Stone在日常的业务开发中偶尔会遇到需要将 List 集合中的重复数据去除掉的场景。这个时候可能有同学会问为什么不直接使用 Set 或者 LinkedHashSet 呢这样不就没有重复数据的问题了嘛不得不说能提这个问题的同学很机智一眼就看到了问题的本质。但是在实际的业务开发中遇到的情况会更复杂。比如List 集合可能是历史遗留问题也有可能是调用接口返回的类型限制只能使用 List 接收又或者是代码写了一半在做多个集合合并的时候才发现了这个问题总之造成问题的原因有很多种这里就不一一列举了。当发现这个问题之后如果可以通过改造原有代码把原来的 List 类型替换成 Set 类型那就可以直接修改集合的类型即可。但如果压根就修改不了或者是修改的成本太大那接下来这 6 种去重的方法将帮你将解决问题。前置知识正式开始之前先来搞懂两组概念无序集合和有序集合 无序和有序。因为接下来的方法实现中会反复提及这两组概念所以有必要在正式开始之前先把它们搞清楚。无序集合无序集合是指数据读取的顺序和数据插入的顺序是不一致的。例如插入集合的顺序是1、5、3、7而集合的读取顺序竟然是1、3、5、7。有序集合有序集合的概念和无序集合的概念正好相反它是指集合的读取顺序和插入顺序是一致的。例如插入数据的顺序是1、5、3、7那么读取的顺序也是1、5、3、7。有序和无序通过上面的无序集合和有序集合我们可以得出有序和无序的概念。有序指的是数据的排列顺序和读取顺序符合我们的预期就叫做有序。而无序指的是数据的排列顺序和读取顺序不符合我们的预期就叫做无序。PS如果对于有序和无序的概念不是很清楚也没关系通过下面的事例我们可以进一步的理解它们的含义。方法1contains判断去重(有序)要进行数据去重我们首先想到的是新建一个集合然后循环原来的集合每次循环判断原集合中的循环项如果当前循环的数据没有在新集合中存在就插入已经存在了就舍弃这样当循环执行完我们就得到了一个没有重复元素的集合了实现代码如下public class ListDistinctExample {public static void main(String[] args) {ListInteger list new ArrayListInteger() {{add(1);add(3);add(5);add(2);add(1);add(3);add(7);add(2);}};System.out.println(原集合: list);method(list);}/*** 自定义去重* param list*/public static void method(ListInteger list) {// 新集合ListInteger newList new ArrayList(list.size());list.forEach(i - {if (!newList.contains(i)) { // 如果新集合中不存在则插入newList.add(i);}});System.out.println(去重集合: newList);}
}以上程序执行的结果如下所示此方法的优点的理解起来比较简单并且最终得到的集合也是有序的这里的有序指的是新集合的排列顺序和原集合的顺序是一致的但缺点是实现代码有点多不够简洁优雅。方法2迭代器去重(无序)自定义 List 去重除了上面的新建集合之外我们也可以使用迭代器循环判断每一项数据如果当前循环的数据在集合中存在两份或两份以上就将当前的元素删除掉这样循环完之后也可以得到一个没有重复数据的集合实现代码如下public class ListDistinctExample {public static void main(String[] args) {ListInteger list new ArrayListInteger() {{add(1);add(3);add(5);add(2);add(1);add(3);add(7);add(2);}};System.out.println(原集合: list);method_1(list);}/*** 使用迭代器去重* param list*/public static void method_1(ListInteger list) {IteratorInteger iterator list.iterator();while (iterator.hasNext()) {// 获取循环的值Integer item iterator.next();// 如果存在两个相同的值if (list.indexOf(item) ! list.lastIndexOf(item)) {// 移除最后那个相同的值iterator.remove();}}System.out.println(去重集合: list);}
}以上程序执行的结果如下所示此方法的实现比上一种方法的实现代码要少一些并且不需要新建集合但此方法得到的新集合是无序的也就是新集合的排列顺序和原集合不一致因此也不是最优的解决方案。方法3HashSet去重(无序)我们知道 HashSet 天生具备“去重”的特性那我们只需要将 List 集合转换成 HashSet 集合就可以了实现代码如下public class ListDistinctExample {public static void main(String[] args) {ListInteger list new ArrayListInteger() {{add(1);add(3);add(5);add(2);add(1);add(3);add(7);add(2);}};System.out.println(原集合: list);method_2(list);}/*** 使用 HashSet 去重* param list*/public static void method_2(ListInteger list) {HashSetInteger set new HashSet(list);System.out.println(去重集合: set);}
}以上程序执行的结果如下所示此方法的实现代码较为简洁但缺点是 HashSet 会自动排序这样新集合的数据排序就和原集合不一致了如果对集合的顺序有要求那么此方法也不能满足当前需求。方法4LinkedHashSet去重(有序)既然 HashSet 会自动排序不能满足需求那就使用 LinkedHashSet它既能去重又能保证集合的顺序实现代码如下public class ListDistinctExample {public static void main(String[] args) {ListInteger list new ArrayListInteger() {{add(1);add(3);add(5);add(2);add(1);add(3);add(7);add(2);}};System.out.println(原集合: list);method_3(list);}/*** 使用 LinkedHashSet 去重* param list*/public static void method_3(ListInteger list) {LinkedHashSetInteger set new LinkedHashSet(list);System.out.println(去重集合: set);}
}以上程序执行的结果如下所示从上述代码和执行结果可以看出LinkedHashSet 是到目前为止实现比较简单且最终生成的新集合与原集合顺序保持一致的实现方法是我们可以考虑使用的一种去重方法。方法5TreeSet去重(无序)除了以上的 Set 集合之外我们还可以使用 TreeSet 集合来实现去重功能实现代码如下public class ListDistinctExample {public static void main(String[] args) {ListInteger list new ArrayListInteger() {{add(1);add(3);add(5);add(2);add(1);add(3);add(7);add(2);}};System.out.println(原集合: list);method_4(list);}/*** 使用 TreeSet 去重(无序)* param list*/public static void method_4(ListInteger list) {TreeSetInteger set new TreeSet(list);System.out.println(去重集合: set);}
}以上程序执行的结果如下所示比较遗憾的是TreeSet 虽然实现起来也比较简单但它有着和 HashSet 一样的问题会自动排序因此也不能满足我们的需求。方法6Stream去重(有序)JDK 8 为我们带来了一个非常实用的方法 Stream使用它可以实现很多功能比如下面的去重功能public class ListDistinctExample {public static void main(String[] args) {ListInteger list new ArrayListInteger() {{add(1);add(3);add(5);add(2);add(1);add(3);add(7);add(2);}};System.out.println(原集合: list);method_5(list);}/*** 使用 Stream 去重* param list*/public static void method_5(ListInteger list) {list list.stream().distinct().collect(Collectors.toList());System.out.println(去重集合: list);}
}以上程序执行的结果如下所示Stream 实现去重功能和其他方法不同的是它不用新创建集合使用自身接收一个去重的结果就可以了并且实现代码也很简洁并且去重后的集合顺序也和原集合的顺序保持一致是我们最优先考虑的去重方法。总结本文我们介绍了 6 种集合去重的方法其中实现最简洁且去重之后的顺序能和原集合保持一致的实现方法只有两种LinkedHashSet 去重和 Stream 去重而后一种去重方法无需借助新集合是我们优先考虑的去重方法。往期推荐Java 中 List 分片的 5 种方法数组转List的3种方法和使用对比优雅统计代码耗时的4种方法