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

如何去除St对象数组中的重复元素并生成新数组?

数组去重重复对象的解决方案

首先必须明确:要判断两个St对象是否重复,你需要在St类中正确重写equals()和hashCode()方法——默认的Object.equals只会比较对象的内存地址,即使两个对象的id和name完全一致,也会被当成不同对象。

步骤1:重写St类的equals和hashCode

根据你的业务规则(id和name都相同则视为重复),重写方法如下:

import java.util.Objects;

class St {
    private int id;
    private String name;

    // 构造方法
    public St(int id, String name) {
        this.id = id;
        this.name = name;
    }

    // getter/setter(按需添加)
    public int getId() { return id; }
    public void setId(int id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    // 重写equals:判断id和name是否都相等
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        St st = (St) o;
        return id == st.id && Objects.equals(name, st.name);
    }

    // 重写hashCode:和equals逻辑保持一致,用id和name生成哈希值
    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }

    // 可选:重写toString方便打印查看
    @Override
    public String toString() {
        return "St{id=" + id + ", name='" + name + "'}";
    }
}

步骤2:实现去重逻辑

方法一:用HashSet快速去重(推荐,代码简洁)

HashSet会自动过滤重复元素,依赖你刚才重写的equals和hashCode:

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        St[] students = {new St(1, "a"), new St(1, "a"), new St(2, "b")};

        // 将数组转成HashSet去重
        Set<St> uniqueStudentSet = new HashSet<>(Arrays.asList(students));
        // 再将Set转回数组
        St[] uniqueStudents = uniqueStudentSet.toArray(new St[0]);

        // 打印去重后的结果
        for (St st : uniqueStudents) {
            System.out.println(st);
        }
    }
}

方法二:手动遍历去重(无需额外集合类的场景)

用一个临时列表存储已出现的元素,遍历原数组时判断是否已存在:

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        St[] students = {new St(1, "a"), new St(1, "a"), new St(2, "b")};
        List<St> uniqueStudentList = new ArrayList<>();

        for (St st : students) {
            // 利用contains判断是否已存在(依赖equals方法)
            if (!uniqueStudentList.contains(st)) {
                uniqueStudentList.add(st);
            }
        }

        // 转成数组
        St[] uniqueStudents = uniqueStudentList.toArray(new St[0]);

        // 打印结果
        for (St st : uniqueStudents) {
            System.out.println(st);
        }
    }
}

你原有代码的问题说明

  1. 重复比较效率低:双层嵌套循环会重复对比元素(比如第0个和第1个,第1个和第0个都会触发判断),时间复杂度为O(n²),数据量大时性能很差。
  2. 未实现去重逻辑:你的代码只是打印重复项,没有将不重复的元素收集成新数组。
  3. 依赖equals的正确性:如果没重写St类的equals,即使对象内容相同,objects[i].name.equals(objects[j].name)只能判断name相同,但无法保证id也相同,而且默认equals会认为是不同对象。

内容的提问来源于stack exchange,提问作者AishaWho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:15:55