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

Java中如何对比ArrayList内的Individual对象查找姓名匹配或颠倒匹配项

实现思路

  • 为每个Individual生成正序姓名键和倒序姓名键:正序键由firstName + "|" + lastName拼接而成,倒序键由lastName + "|" + firstName拼接而成(用分隔符可以避免firstName="ab", lastName="c"和firstName="a", lastName="bc"这类情况的误匹配)
  • 用哈希表统计每个键关联的所有Individual实例
  • 筛选出所有关联实例数≥2的键对应的实例,去重后就是符合要求的结果集

代码实现

import java.util.*;
import java.util.stream.Collectors;

// 姓名键生成方法,单独抽离方便统一处理空值
private String generateNameKey(String name1, String name2) {
    // 空值兜底处理,可根据业务规则调整空值匹配逻辑
    String n1 = Optional.ofNullable(name1).orElse("");
    String n2 = Optional.ofNullable(name2).orElse("");
    return n1 + "|" + n2;
}

public List<Individual> filterMatchedIndividuals(List<Individual> individualList) {
    // 列表元素不足2个时不可能满足匹配条件,直接返回空
    if (individualList == null || individualList.size() < 2) {
        return Collections.emptyList();
    }

    Map<String, List<Individual>> nameKeyMap = new HashMap<>();
    for (Individual individual : individualList) {
        String forwardKey = generateNameKey(individual.getFirstName(), individual.getLastName());
        String reverseKey = generateNameKey(individual.getLastName(), individual.getFirstName());
        // 正序、倒序键都关联当前个体
        nameKeyMap.computeIfAbsent(forwardKey, k -> new ArrayList<>()).add(individual);
        nameKeyMap.computeIfAbsent(reverseKey, k -> new ArrayList<>()).add(individual);
    }

    // 收集符合条件的个体并去重
    return nameKeyMap.values().stream()
            .filter(list -> list.size() >= 2)
            .flatMap(Collection::stream)
            .distinct()
            .collect(Collectors.toList());
}

扩展说明

如果你需要同时关联手机号的重复逻辑(你的原始列表是通过getAllIndividualsWithDuplicatePhonenumber获取的),可以在生成键的时候把手机号也拼接进去:
generateNameKey(individual.getFirstName(), individual.getLastName()) + "|" + individual.getTaxPayer().getPhoneNumber()
就能筛选出姓名符合规则且手机号相同的个体。
如果使用的JDK版本低于8,把stream相关代码替换为普通循环遍历即可,核心匹配逻辑无需调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:30:04