请编程实现删除 List 集合中的重复元素

以下是使用 Java 编程实现删除 List 集合中重复元素的几种方法:


方法 1:使用 Set 去重

借助 Set 的不允许重复元素的特性,可以实现对 List 的去重操作。

import java.util.*;

public class RemoveDuplicates {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(Arrays.asList("A", "B", "A", "C", "B", "D"));
        System.out.println("Original List: " + list);

        // 使用 Set 去重
        List<String> uniqueList = new ArrayList<>(new HashSet<>(list));
        System.out.println("List after removing duplicates: " + uniqueList);
    }
}

说明

  • List 转换为 Set,利用 Set 的特性去重。
  • 再将 Set 转回 List

方法 2:使用 Listcontains() 方法

通过遍历原始列表并将唯一元素添加到新的列表中来实现去重。

import java.util.*;

public class RemoveDuplicates {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(Arrays.asList("A", "B", "A", "C", "B", "D"));
        System.out.println("Original List: " + list);

        // 创建一个新的 List 存储唯一元素
        List<String> uniqueList = new ArrayList<>();
        for (String element : list) {
            if (!uniqueList.contains(element)) {
                uniqueList.add(element);
            }
        }

        System.out.println("List after removing duplicates: " + uniqueList);
    }
}

说明

  • 每次检查新列表中是否已经包含当前元素。
  • 如果没有包含,则添加到新列表中。

方法 3:使用 LinkedHashSet 保持原始顺序

如果希望去重后的结果保留原始顺序,可以使用 LinkedHashSet

import java.util.*;

public class RemoveDuplicates {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(Arrays.asList("A", "B", "A", "C", "B", "D"));
        System.out.println("Original List: " + list);

        // 使用 LinkedHashSet 去重并保持顺序
        List<String> uniqueList = new ArrayList<>(new LinkedHashSet<>(list));
        System.out.println("List after removing duplicates: " + uniqueList);
    }
}

说明

  • LinkedHashSet 不仅去重,还会保持元素的插入顺序。

方法 4:使用 Java 8 Stream

借助 Java 8 的流式操作,可以实现去重。

import java.util.*;
import java.util.stream.Collectors;

public class RemoveDuplicates {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(Arrays.asList("A", "B", "A", "C", "B", "D"));
        System.out.println("Original List: " + list);

        // 使用 Stream 去重
        List<String> uniqueList = list.stream()
                                      .distinct()
                                      .collect(Collectors.toList());
        System.out.println("List after removing duplicates: " + uniqueList);
    }
}

说明

  • 使用 distinct() 方法直接过滤掉重复的元素。
  • Collectors.toList() 将去重后的元素重新收集为一个列表。

方法 5:原地去重(不使用额外集合)

通过在原始列表中删除重复元素实现去重。

import java.util.*;

public class RemoveDuplicates {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(Arrays.asList("A", "B", "A", "C", "B", "D"));
        System.out.println("Original List: " + list);

        // 原地去重
        for (int i = 0; i < list.size(); i++) {
            String element = list.get(i);
            for (int j = i + 1; j < list.size(); j++) {
                if (element.equals(list.get(j))) {
                    list.remove(j);
                    j--; // 调整索引以避免跳过元素
                }
            }
        }

        System.out.println("List after removing duplicates: " + list);
    }
}

说明

  • 外层循环逐个检查每个元素,内层循环比较后续元素是否重复。
  • 如果重复,则从原列表中移除。

性能分析

方法 优点 缺点
方法 1 简单直接,代码量少 无法保持原始顺序
方法 2 适合少量数据,逻辑简单 对于大列表,性能较差(嵌套循环导致 O(n²))
方法 3 去重且保持原始顺序 依赖额外数据结构(LinkedHashSet
方法 4 代码简洁,现代化写法,支持并行流 Java 8+ 才可用
方法 5 不需要额外的存储,原地修改 性能较差(嵌套循环 O(n²))

总结

  • 如果数据量较大,推荐使用 方法 1(HashSet方法 3(LinkedHashSet
  • 如果需要保持原始顺序,推荐使用 方法 3(LinkedHashSet方法 4(Stream)
  • 如果数据量较小,方法 2 和 5 也可以使用,但注意性能问题。

发表评论

后才能评论