专注Java教育14年 全国咨询/投诉热线:444-1124-454
星辉LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java模糊字符串与名称匹配

Java模糊字符串与名称匹配

更新时间:2022-12-15 11:48:10 来源:星辉 浏览1561次

用 Java 编写的独立 CSV 数据加载过程,它必须使用一些模糊字符串匹配。使用名字和姓氏进行匹配,并在运行开始时缓存所有可能性。找到匹配项后,需要那个人在运行期间在多个地方对象。使用番石榴Objects.hashCode()从名字和姓氏中创建了一个散列。

缓存机制如下所示:

Map<Integer,PersonDO> personCache = Maps.newHashMap();
for(PersonDO p: dao.getPeople()) {
    personCache.put(Objects.hashCode(p.getFirstName(),p.getLastName()), p);
}

大多数时候,在 firstname+lastname 上都能找到匹配项,但当它没有匹配到时,就回过头来使用 ApacheStringUtils.getLevenshteinDistance()来尝试匹配它。匹配逻辑流程是这样的:

    person = personCache.get(Objects.hashCode(firstNameFromCSV,lastNameFromCSV));
    if(person == null) {//fallback to fuzzy matching
        person = findClosetMatch(firstNameFromCSV+lastNameFromCSV);
    }

这是findClosetMatch()方法:

private PersonDO findClosetMatch(String name) {
    int min = 15;//initial value
    int testVal=0;
    PersonDO matchedPerson = null;
    for(PersonDO person: personCache.values()) {
        testVal = StringUtils.getLevenshteinDistance(name,person.getFirstName()+person.getLastName());
        if( testVal < min ) {
            min = testVal;
            matchedPerson = person;
        }
    }
    if(matchedPerson == null) {
        throw new Exception("Unable to find person: " + name) 
    }
    return matchedPerson;
}

这适用于简单的拼写错误、错别字和缩短的名称(即 Mike->Michael),但是当完全丢失缓存中的一个传入名称时,最终会返回误报匹配。为了防止这种情况发生,将最小值设置findClosetMatch()为 15(即不超过 15 个字符);它大部分时间都有效。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>