2016-10-15 69 views
-1

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

+0

他们会永远是同样的长度? – MrB

+0

它看起来像你的字符串总是有相同的长度,所以你只需要计算不同的符号。简单的循环将完成这项工作。 – talex

+0

我更新了一些错误修复的答案,希望它有所帮助。 ':)' –

回答

3

我们假设你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(); 
} 
+0

计算相似性而不是更简单吗?你正在做一个额外的操作。 '(1 - dif)' –

+0

此外,这也要么返回1或0,因为你不是铸造整齐双打 –

+0

@nickzoum,更新了我的答案。 ':)' –

0

你可以很容易有这样的方法:

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或空字符串这将引发一些错误,所以如果你不希望出现这种情况,那么你可以添加一些检查,像返回0 :

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

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

0
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);