如何检查字符串相似度

How to check for String similarity

我需要比较两个字符串,看看它们是否相似,相似程度如何。例如,我有一个字符串 "5000002105416",与 "5000003205416" 相比,它应该给我结果 0.85,因为只有 2 个符号在包含的两个字符串中不匹配13 个符号。原因是我用Zbar扫描条码,有时会出现一些错误的结果,我需要检查这个结果是否与我需要匹配的一些硬编码标签相似。

您可以很容易地使用如下方法:

public static double compare(String string, String compareString){
    int length = string.length();
    int comLength = compareString.length();
    int max = length;
    int min = comLength;
    int result = 0;
    if (length < comLength){
        max = comLength;
        min = length;
    }

    for(int index = 0; index < min; index++){
        if(string.charAt(index) == compareString.charAt(index)){
            result++;
        }
    }
    return (double)(result)/ (double)(max);
}

如果您插入 null 或空字符串,这将引发一些错误,因此如果您不想这样,您可以添加一些 return 0 的检查,例如:

if(string.isEmpty()){
    if(compareString.isEmpty()){
        return 1;
    }
    return  0;
}else if(compareString.isEmpty()){
    return 0;
}

或者类似的东西。您也可以使用类似的逻辑来防止 nulls

假设您的 String 具有相同的长度,因此您需要一个函数来遍历它们,比较每个 char 并找出差异的数量:

double similarity(String a, String b) {
    if(a.length() == 0) return 1;
    int numberOfSimilarities = 0;
    for(int i = 0; i < a.length(); ++i) {
        if(a.charAt(i) == b.charAt(i)) {
            ++numberOfSimilarities;
        }
    }
    return (double) numberOfSimilarities / a.length();
}
String a, b;
int count = 0;
for(int i = 0; i<13; i++){
    if(a.charAt(i)==b.charAt(i)) count++;
}
System.out.println(count/13.0);