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

Java 8 如何在列表中查找与目标名称排序最接近的匹配项

Java 8 实现名称匹配算法

实现思路

  1. 优先做完全匹配校验:遍历候选列表,若存在和目标字符串完全相等的项直接返回
  2. 无完全匹配项时,按以下规则计算每个候选的匹配得分,返回得分最高的项:
    • 把目标和候选字符串都按空格拆分为单词数组
    • 从第一个单词开始逐位比对,统计连续匹配的单词数量,连续匹配数越高得分越高
    • 连续匹配数相同时,总单词数和目标越接近的候选得分越高,避免短匹配优先

完整代码实现

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;

public class NameMatcher {

    public static String findBestMatch(String target, List<String> candidates) {
        // 第一步:优先返回完全匹配项
        Optional<String> exactMatch = candidates.stream()
                .filter(target::equals)
                .findFirst();
        if (exactMatch.isPresent()) {
            return exactMatch.get();
        }

        // 第二步:无完全匹配时计算得分,返回得分最高的项
        return candidates.stream()
                .max(Comparator.comparingInt(candidate -> calculateScore(target, candidate)))
                .orElse(null); // 候选列表为空时返回null,可根据需求调整
    }

    private static int calculateScore(String target, String candidate) {
        List<String> targetWords = Arrays.asList(target.split(" "));
        List<String> candidateWords = Arrays.asList(candidate.split(" "));
        
        // 统计从头开始的连续匹配单词数
        int continuousMatchCount = 0;
        int minLength = Math.min(targetWords.size(), candidateWords.size());
        for (int i = 0; i < minLength; i++) {
            if (targetWords.get(i).equals(candidateWords.get(i))) {
                continuousMatchCount++;
            } else {
                break;
            }
        }
        
        // 连续匹配数优先级远高于长度差,权重可根据实际需求调整
        int lengthDifference = Math.abs(targetWords.size() - candidateWords.size());
        return continuousMatchCount * 100 - lengthDifference;
    }

    // 测试示例
    public static void main(String[] args) {
        String target = "Smith Johnson Williams Brown";
        List<String> candidates = Arrays.asList(
                "Johnson",
                "Johnson Williams Brown",
                "Smith Johnson Brown Williams",
                "Smith Johnson",
                "Smith Williams Brown Johnson"
        );
        System.out.println(findBestMatch(target, candidates)); 
        // 输出结果:Smith Johnson Brown Williams,符合需求
    }
}

规则调整说明

如果后续需要修改匹配逻辑,比如要计入非连续的单词匹配、或者调整顺序匹配的权重,只需要修改calculateScore方法内的得分计算规则即可,不需要改动外层的匹配流程。

内容的提问来源于stack exchange,提问作者help me code

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:36:03