从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
相关产品推荐
相关产品推荐

