请编程实现删除 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:使用 List
的 contains()
方法
通过遍历原始列表并将唯一元素添加到新的列表中来实现去重。
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 也可以使用,但注意性能问题。