如何仅用ArrayList、subList()和contains()方法查找并打印重复值
从ArrayList中提取重复元素的正确实现
原代码的问题点
- 初始化
dupList时直接用list.subList(1, list.size()),把原列表从索引1开始的所有元素都塞进结果里,完全偏离了收集重复元素的需求 if(list.contains(list.get(i)))这个判断毫无意义,因为当前元素本来就在原列表里,会导致所有元素都被重复添加进结果- 没有做去重处理,同一个重复值会被多次加入结果列表
正确实现代码
import java.util.ArrayList; public class DuplicateFinder { public static void main(String[] args) { // 示例测试列表 ArrayList<Integer> numList = new ArrayList<>(); numList.add(2); numList.add(3); numList.add(4); numList.add(4); numList.add(5); ArrayList<Integer> numList2 = dups(numList); System.out.println("The following numbers were duplicated in the ArrayList: " + numList2); } public static ArrayList<Integer> dups(ArrayList<Integer> list) { // 初始化空列表存储重复元素 ArrayList<Integer> dupList = new ArrayList<>(); for (int i = 0; i < list.size(); i++) { Integer currentNum = list.get(i); // 生成当前索引之后的子列表,只检查后续元素是否有重复 ArrayList<Integer> subList = new ArrayList<>(list.subList(i + 1, list.size())); // 两个判断:1. 当前元素在后续子列表中存在;2. 该元素还没被加入结果列表(去重) if (subList.contains(currentNum) && !dupList.contains(currentNum)) { dupList.add(currentNum); } } return dupList; } }
逻辑说明
- 循环遍历原列表的每一个元素,每次取出当前元素
currentNum - 创建当前索引i之后的子列表(从
i+1到列表末尾),这样只检查当前元素在后续位置是否重复出现,完全匹配你最初的思路 - 双重判断保证:既确认当前元素是重复的,又避免同一个重复值被多次添加到结果里
- 测试示例
[2,3,4,4,5]的输出结果为[4],符合预期
内容的提问来源于stack exchange,提问作者Neigh6or
相关产品推荐
相关产品推荐

