You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:44:45