List 去重

傷城~ 2022-10-24 11:43 250阅读 0赞

在日常工作中,需要对 List 进行去重的场景很多。对于我这样一个菜鸟来说,可能能想到的最简单粗暴的方法就是双层循环去重,但是在看到这篇文章之后,果断收藏了。

https://mp.weixin.qq.com/s/N1MRYswi8v1Lh6pdDz8upQ

来源于微信公众号“Java爱好者”,在此表示感谢。若有侵权,请联系删除~

既然刚才说到了简单粗暴的方法,那么我们就先来看看这种暴力方法:

1.双层循环

  1. import java.util.*;
  2. public class ListDemo {
  3. private void removeRepeat(List<Integer> listInt) {
  4. List<Integer> list = new ArrayList<>(listInt);
  5. for (int i = 0; i < list.size(); i++) {
  6. for (int j = 0; j < list.size(); j++) {
  7. if (i != j && list.get(i).equals(list.get(j))) {
  8. list.remove(list.get(j));
  9. }
  10. }
  11. }
  12. System.out.println("去重后的list = " + list);
  13. }
  14. public static void main(String[] args) {
  15. ListDemo listDemo = new ListDemo();
  16. Integer[] array = {1,1,3,5,7,6,4,3,4,5,8,2};
  17. List<Integer> listInt = Arrays.asList(array);
  18. System.out.println("去重前的list = " + listInt);
  19. listDemo.removeRepeat(listInt);
  20. }
  21. }

20210129144754335.png

此方法不在乎原 List 中的数据的顺序。

2.利用 List 的 contains 方法,遍历循环,重新排序,只添加一次数据

  1. import java.util.*;
  2. public class ListDemo {
  3. private void removeRepeat(List<Integer> listInt) {
  4. List<Integer> list = new ArrayList<>(listInt.size());
  5. for (Integer i : listInt) {
  6. if (!list.contains(i)) {
  7. list.add(i);
  8. }
  9. }
  10. System.out.println("去重后的list = " + list);
  11. }
  12. public static void main(String[] args) {
  13. ListDemo listDemo = new ListDemo();
  14. Integer[] array = {1,1,3,5,7,6,4,3,4,5,8,2};
  15. List<Integer> listInt = Arrays.asList(array);
  16. System.out.println("去重前的list = " + listInt);
  17. listDemo.removeRepeat(listInt);
  18. }
  19. }

20210129144721835.png

这种方法对于 String 类型的 List 同样适用。

  1. import java.util.*;
  2. public class ListDemo {
  3. private void removeRepeat(List<String> listStr) {
  4. List<String> list = new ArrayList<>();
  5. for (String str : listStr) {
  6. if (!list.contains(str)) {
  7. list.add(str);
  8. }
  9. }
  10. System.out.println("去重后的list = " + list);
  11. }
  12. public static void main(String[] args) {
  13. ListDemo listDemo = new ListDemo();
  14. String[] array = {"A","B","B","C","A","D","E","C","F","D","G"};
  15. List<String> listStr = Arrays.asList(array);
  16. System.out.println("去重前的list = " + listStr);
  17. listDemo.removeRepeat(listStr);
  18. }
  19. }

20210129144624649.png

3.使用 HashSet

利用 HashSet 不能添加重复数据的特性来对 List 进行去重

  1. import java.util.*;
  2. public class ListDemo {
  3. private void removeRepeat(List<String> listStr) {
  4. List<String> list = new ArrayList<>();
  5. HashSet<String> set = new HashSet<>();
  6. for (String str : listStr) {
  7. if (set.add(str)) {
  8. list.add(str);
  9. }
  10. }
  11. System.out.println("去重后的list = " + list);
  12. }
  13. public static void main(String[] args) {
  14. ListDemo listDemo = new ListDemo();
  15. String[] array = {"A","B","B","C","A","D","E","C","F","D","G"};
  16. List<String> listStr = Arrays.asList(array);
  17. System.out.println("去重前的list = " + listStr);
  18. listDemo.removeRepeat(listStr);
  19. }
  20. }

2021012914532633.png

4.使用 java 8 新特性 stream 对 List 进行去重操作

  1. public static void main(String[] args) {
  2. String[] array = {"A","B","B","C","A","G","E","C","F","D","G"};
  3. List<String> listStr = Arrays.asList(array);
  4. System.out.println("去重前的list = " + listStr);
  5. List<String> result = listStr.stream().distinct().collect(Collectors.toList());
  6. System.out.println("去重后的list = " + result);
  7. }

20210129145947608.png

5.使用 LinkedHashSet 来对 List 进行去重操作

  1. public static void main(String[] args) {
  2. String[] array = {"A","B","B","C","A","G","E","C","F","D","G"};
  3. List<String> listStr = Arrays.asList(array);
  4. System.out.println("去重前的list = " + listStr);
  5. LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>(listStr);
  6. List<String> result = new ArrayList<>(linkedHashSet);
  7. System.out.println("去重后的list = " + result);
  8. }

20210129150250901.png

当需要按照指定的对象属性去去重时,上面这几种方法就不是很适用了,推荐 Stream 的另一种方法:

  1. List<AaDto> collect = list.stream().collect(Collectors.collectingAndThen(
  2. Collectors.toCollection(() -> new TreeSet<>(
  3. Comparator.comparing(p->p.getA() + p.getB()))), ArrayList::new);

同时根据结果集 list 中的 A 属性和 B 属性去过滤数据,如果只需要根据唯一的一个属性去过滤的话,就不需要去拼接了。参考:https://www.cnblogs.com/unknows/p/13534953.html

发表评论

表情:
评论列表 (有 0 条评论,250人围观)

还没有评论,来说两句吧...

相关阅读

    相关 List

    在日常工作中,需要对 List 进行去重的场景很多。对于我这样一个菜鸟来说,可能能想到的最简单粗暴的方法就是双层循环去重,但是在看到这篇文章之后,果断收藏了。 [https:

    相关 List

    我们知道List允许有相同的元素,那么我们怎么通过方法来让它去重呐, 我们都会想到Set集合,Set集合是不允许有相同的元素的,所以我们可以借助Set集合,把重复的元素去掉

    相关 List

      list中数据的去重,通常使用将list转换为set,简单直接,因为set集合的特点就是没有重复的元素。需要考虑一下两种情况: 1.List集合中的数据类型是基本数据

    相关 List

    思路:   1、先将list转换成HashSet   2、将HashSet再转换成List 源码如下: List<A> list = new ArrayList