ArrayList检测EzVarInteger重复值,求返回重复名称的更优方案
更优的ArrayList重复EzVarInteger检测方案
嘿,刚接触这类开发能想到并行数组的思路已经很棒啦!不过确实有更简洁高效的方式来实现你要的需求,下面给你分享几种靠谱的方案:
方案一:使用HashMap记录值与对应名称列表
这是最直观也最高效的方式,利用哈希表的O(1)查找特性,遍历一次列表就能完成所有值的分组,后续直接筛选出分组数量大于1的名称即可。
示例代码(Java为例):
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class DuplicateDetector { public List<String> findDuplicateEzVarNames(List<EzVarInteger> ezVarList) { // 用HashMap存:值 -> 对应EzVarInteger的名称列表 Map<Integer, List<String>> valueToNamesMap = new HashMap<>(); for (EzVarInteger ezVar : ezVarList) { int value = ezVar.getValue(); String name = ezVar.getName(); // 如果key不存在就创建新列表,然后添加名称 valueToNamesMap.computeIfAbsent(value, k -> new ArrayList<>()).add(name); } // 收集所有重复的名称 List<String> duplicateNames = new ArrayList<>(); for (Map.Entry<Integer, List<String>> entry : valueToNamesMap.entrySet()) { List<String> names = entry.getValue(); if (names.size() > 1) { duplicateNames.addAll(names); } } return duplicateNames; } }
这个方案的优势:
- 时间复杂度为O(n),比双重循环的并行数组方案效率高很多
- 不需要手动维护索引关系,代码更简洁易读
- 能一次性拿到所有重复值对应的所有名称,信息更完整
方案二:用HashSet快速定位重复值(简化版)
如果你的需求只是找出所有重复的名称,不需要关联对应的重复值,可以用HashSet辅助,遍历过程中实时检测重复:
示例代码:
import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class DuplicateDetector { public List<String> findDuplicateEzVarNames(List<EzVarInteger> ezVarList) { Set<Integer> seenValues = new HashSet<>(); Set<String> duplicateNames = new HashSet<>(); // 用Set避免重复添加同一个名称 for (EzVarInteger ezVar : ezVarList) { int value = ezVar.getValue(); if (seenValues.contains(value)) { duplicateNames.add(ezVar.getName()); // 如果需要把第一次出现的名称也加进去,这里需要额外存一个值到名称的映射 } else { seenValues.add(value); } } return new ArrayList<>(duplicateNames); } }
注意:这个简化版默认只收集重复出现的名称,如果需要包含第一次出现的那个,得额外加一个Map<Integer, String>来记录第一次出现的名称,在检测到重复时把两个名称都加入结果。
对比你原来的并行数组方案
你之前考虑的并行数组思路虽然能实现功能,但存在不少局限:
- 需要手动维护两个数组的索引对应关系,一旦列表有元素增删,很容易出现索引错位的bug
- 双重循环的查找逻辑时间复杂度是O(n²),当列表数据量较大时,性能会明显下降
- 代码可读性和维护性较差,后续修改或扩展功能会比较麻烦
而上面的哈希表方案完美解决了这些问题,更适合实际项目开发使用。
如果你的EzVarInteger的value有可能为null,记得在代码里加上null值的判断处理哦!
内容的提问来源于stack exchange,提问作者Zyzyx
相关产品推荐
相关产品推荐

