2016-10-15 2 views
-1

Мне нужно сравнить две строки и выяснить, похожи они или нет, и сколько. Например, у меня есть String "5000002105416" и по сравнению с "5000003205416" он должен дать мне результат 0.85, так как есть только 2 символы, которые не совпадают в обеих строках, которые содержат 13 символов. Причина в том, что я использую Zbar для сканирования штрих-кодов, и иногда это дает мне немного неправильный результат, и мне нужно проверить, похож ли этот результат на некоторые жестко закодированные теги, которые мне нужно сопоставить.Как проверить сходство строк

+0

Будут ли они всегда будет такая же длина? – MrB

+0

Похоже, что ваши строки всегда имеют одинаковую длину, поэтому вам нужно только подсчитать разные символы. Простой цикл выполнит эту работу. – talex

+0

Я обновил свой ответ на некоторые исправления ошибок, надеюсь, что это поможет. ':)' –

ответ

3

Пусть Предположим, ваши String s имеют одинаковую длину, так что вам нужна функция, которая перебирать их обоих, сравнивая каждый 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, потому что вы не бросаете ints в парные –

+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); 
Смежные вопросы