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

如何去除对象数组中大量重复元素且返回相同类型的数组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:45:04