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

如何检查Java数组或列表内对象的指定字段组合是否唯一?

Java校验Person列表name与address组合唯一性方案

需求说明

给定Person对象列表,每个对象包含name、address、phone三个属性,校验规则如下:

  • 仅当两个对象的name与address完全相同时,视为重复数据,校验不通过返回false
  • 仅name相同、address不同,或仅address相同、name不同,均视为合法数据,校验通过返回true

常见误区

很多初学者最初会尝试用List的contains方法判断重复,该方法默认基于对象内存地址判断相等,若未重写Person类的equals与hashCode方法,无法实现自定义字段组合的重复校验,会导致校验逻辑失效。

实现方案(Comparator + TreeSet)

该方案不需要修改Person类的原有逻辑,基于JDK自带工具类即可实现,代码如下:

1. Person实体类定义

import lombok.Data;

// 无Lombok环境可手动编写getter、setter方法
@Data
public class Person {
    private String name;
    private String address;
    private String phone;
}

2. 校验方法实现

import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;

public class UniqCheckService {
    public boolean checkPersonUniq(List<Person> personList) {
        // 定义比较规则:优先比较name,name相同再比较address,二者都一致才视为相同元素
        Comparator<Person> uniqComparator = Comparator
                .comparing(Person::getName)
                .thenComparing(Person::getAddress);
        TreeSet<Person> dedupSet = new TreeSet<>(uniqComparator);

        for (Person person : personList) {
            // TreeSet的add方法返回false代表已存在相同规则的元素,直接返回校验失败
            if (!dedupSet.add(person)) {
                return false;
            }
        }
        // 所有元素都添加成功,无重复组合,校验通过
        return true;
    }
}

方案优势

  • 无侵入:不需要重写Person类的equals与hashCode,不会影响该类其他业务场景的相等性判断逻辑
  • 性能优:基于TreeSet的排序去重特性,时间复杂度为O(n log n),远优于双重循环的O(n²)方案
  • 易维护:代码语义清晰,后续需要调整校验规则时只需修改Comparator的比较逻辑即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:06:04