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

从Related Practice对象列表提取唯一Name值的方法优化求助

问题描述

类定义

public class RelatedPractice {
    String Name;
    Integer id;
}

(注:原类名存在空格,修正为符合Apex语法的RelatedPractice)

需求说明

给定一个RelatedPractice对象列表,从中提取唯一的Name值(去重后的值)。

问题现状

我编写了一段Apex代码,但无法适配所有场景,寻求更优的实现方案。

现有代码

//This method return unique values from a list
private static List<Related_Practice__c> getUniqueValues(List<Related_Practice__c> listInput){
    List<Related_Practice__c> listOutput = new List<Related_Practice__c>();
    
    for(Integer i = 0; i<listInput.size();i++){
        for(Integer j = 0;j<listInput.size();j++){
            if(i != j){
               if(listInput[j].Practice_Name__c == listInput[i].Practice_Name__c){
                
                listInput.remove(j);
                }
            }
        }
    }
    listOutput.addAll(listInput);
    return listOutput;
}

现有代码的问题

  • 性能瓶颈:两层嵌套循环时间复杂度为O(n²),数据量越大执行越慢。
  • 索引错乱:遍历过程中执行listInput.remove(j),会导致后续元素前移,j递增后会跳过下一个元素,部分重复项无法被正确处理。
  • 副作用:直接修改传入的listInput,会改变外部列表的状态,可能引发其他逻辑异常。

优化实现方案

方案1:保留去重后的对象列表

如果需要保留Related_Practice__c对象(取每个唯一Name对应的第一个出现的对象),用Set跟踪已出现的Name即可:

private static List<Related_Practice__c> getUniqueValues(List<Related_Practice__c> listInput) {
    List<Related_Practice__c> uniqueItems = new List<Related_Practice__c>();
    Set<String> seenNames = new Set<String>();
    
    for (Related_Practice__c item : listInput) {
        String name = item.Practice_Name__c;
        // 跳过空值,避免将null加入结果
        if (name == null) continue;
        // 仅当Name未出现过时,加入结果并记录
        if (!seenNames.contains(name)) {
            seenNames.add(name);
            uniqueItems.add(item);
        }
    }
    return uniqueItems;
}

方案2:仅提取唯一的Name字符串集合

如果只需要去重后的Name值,直接返回Set<String>更高效:

private static Set<String> getUniquePracticeNames(List<Related_Practice__c> listInput) {
    Set<String> uniqueNames = new Set<String>();
    for (Related_Practice__c item : listInput) {
        if (item.Practice_Name__c != null) {
            uniqueNames.add(item.Practice_Name__c);
        }
    }
    // 若需要List<String>格式,可转换:return new List<String>(uniqueNames);
    return uniqueNames;
}

优化点说明

  • 性能提升:单次遍历+Set的O(1)查找,时间复杂度降至O(n),大数据量下优势明显。
  • 无副作用:不修改原始输入列表,避免影响外部逻辑。
  • 空值处理:增加了null值判断,避免空Name导致的错误或异常。
  • 逻辑简洁:代码结构清晰,易于维护和扩展。

内容的提问来源于stack exchange,提问作者Yassine El Moustachir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:31:04