Мне нужно сравнить две строки и выяснить, похожи они или нет, и сколько. Например, у меня есть String "5000002105416"
и по сравнению с "5000003205416"
он должен дать мне результат 0.85
, так как есть только 2
символы, которые не совпадают в обеих строках, которые содержат 13
символов. Причина в том, что я использую Zbar для сканирования штрих-кодов, и иногда это дает мне немного неправильный результат, и мне нужно проверить, похож ли этот результат на некоторые жестко закодированные теги, которые мне нужно сопоставить.Как проверить сходство строк
ответ
Пусть Предположим, ваши 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();
}
Не проще ли подсчитать сходство вместо различий? Теперь вы выполняете дополнительную операцию. '(1 - dif)' –
Также это также возвращает 1 или 0, потому что вы не бросаете ints в парные –
@nickzoum, обновили мой ответ. ':)' –
Вы можете легко иметь метод, как:
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
.
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);
Будут ли они всегда будет такая же длина? – MrB
Похоже, что ваши строки всегда имеют одинаковую длину, поэтому вам нужно только подсчитать разные символы. Простой цикл выполнит эту работу. – talex
Я обновил свой ответ на некоторые исправления ошибок, надеюсь, что это поможет. ':)' –