I need to compare two strings and find out if they're similar or not, and how much. For example I have a String "5000002105416"
, and compared to "5000003205416"
it should give me the result 0.85
as there are only 2
symbols that do not match in both strings which contain 13
symbols. The reason is that I'm using Zbar for barcode scanning and sometimes it gives me a bit wrong result, and I need to check whether this result is similar to some hardcoded tags that I need to be matched.
Asked
Active
Viewed 1,876 times
0

Roman Samoilenko
- 932
- 12
- 25
-
Will they always be the same length? – MrB Oct 15 '16 at 13:31
-
It looks like your strings always have same length, so you only need to count different symbols. Simple loop will do the job. – talex Oct 15 '16 at 13:31
-
I updated my answer for some bug fixes, hope it help. `:)` – Masked Man Oct 15 '16 at 16:19
3 Answers
4
Let assume your String
s have the same length, so you need a function that iterate through both of them, comparing each char
and find the number of differences:
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();
}

Masked Man
- 2,176
- 2
- 22
- 41
0
You could easily have a method like:
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);
}
This will throw a few errors if you insert null
or empty string, so if you do not want that then you can add some checks that return 0 like:
if(string.isEmpty()){
if(compareString.isEmpty()){
return 1;
}
return 0;
}else if(compareString.isEmpty()){
return 0;
}
Or something like that. You could use a similar logic to prevent nulls
too.

nick zoum
- 7,216
- 7
- 36
- 80
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);

talex
- 17,973
- 3
- 29
- 66