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
相关产品推荐
相关产品推荐

