如何去除对象数组中大量重复元素且返回相同类型的数组
Java Guide对象数组按属性去重问题修复方案
原代码核心错误排查
- 内循环变量逻辑错误:原内循环写法为
for(int j = i+1; i<guide.length; i++),循环终止条件、自增变量全部误用了外层的i,没有操作j变量,导致内循环运行时会持续累加i的值,直接触发外循环终止条件,因此出现循环提前中断的问题。 ArrayUtils.remove调用参数缺失:Apache Commons包的ArrayUtils.remove方法需要传入两个入参,分别是原始数组、待删除元素的下标,原代码仅传入数组参数,未指定删除位置,逻辑不符合预期。- 未适配数组动态变化的边界:删除数组元素后数组长度会动态缩小,原固定边界的循环逻辑会出现下标越界、漏判元素的问题。
修复方案
方案1:基于原双重循环逻辑修改
适配数组动态变化的特性,修正循环变量逻辑:
import org.apache.commons.lang3.ArrayUtils; public Guide[] checkGuideDuplication (Guide[] guide){ for(int i = 0; i < guide.length; i++){ // 内循环j自增逻辑移到循环体内,避免删除元素后漏判 for(int j = i+1; j < guide.length; ){ if(guide[i].getGuide().trim().equals(guide[j].getGuide().trim())){ // 指定删除下标为j的元素 guide = (Guide[]) ArrayUtils.remove(guide, j); } else { // 未触发删除时才将j后移 j++; } } } return guide; }
方案2:基于HashSet实现(更适合大量重复元素场景)
时间复杂度仅为O(n),性能远优于双重循环实现,逻辑更稳定:
import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public Guide[] checkGuideDuplication (Guide[] guide){ // 存储已出现过的guide属性值 Set<String> existedGuideVal = new HashSet<>(); List<Guide> resultList = new ArrayList<>(); for (Guide g : guide) { String currentVal = g.getGuide().trim(); if (!existedGuideVal.contains(currentVal)) { existedGuideVal.add(currentVal); resultList.add(g); } } // 直接转回Guide类型数组返回,满足后续调用对象方法的需求 return resultList.toArray(new Guide[0]); }
内容的提问来源于stack exchange,提问作者Alex Rodriguez
相关产品推荐
相关产品推荐

