更新时间:2022-12-15 11:48:10 来源:极悦 浏览1797次
用 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 个字符);它大部分时间都有效。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习