2016-10-15 88 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);