2016-10-15 3 views
-1

2 개의 문자열을 비교하여 비슷하거나 유사한 지, 그리고 얼마나 많은지 알아야합니다. 예를 들어, 문자열이 "5000002105416"이고 "5000003205416"과 비교하면 기호를 포함하는 두 문자열에서 일치하지 않는 기호가 2이므로 결과는 0.85이어야합니다. 그 이유는 바코드 스캐닝에 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 또는 빈 문자열을 삽입하면 원하지 않는, 그래서 만약이 다음과 같이 0을 반환 몇 가지 검사를 추가 할 수있는 몇 가지 오류가 발생합니다

:

+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

또한 정수를 double 형으로 변환하지 않기 때문에 1 또는 0을 반환합니다. –

+0

@nickzoum, 대답을 업데이트했습니다. ':)' –

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