2019-03-02 15:10:46 +01:00
|
|
|
/*
|
|
|
|
* To change this license header, choose License Headers in Project Properties.
|
|
|
|
* To change this template file, choose Tools | Templates
|
|
|
|
* and open the template in the editor.
|
|
|
|
*/
|
|
|
|
package FunctionLayer;
|
|
|
|
|
2019-03-03 13:17:07 +01:00
|
|
|
import java.util.concurrent.Callable;
|
|
|
|
|
2019-03-02 15:10:46 +01:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @author install1
|
|
|
|
*/
|
2019-03-03 13:17:07 +01:00
|
|
|
public class LevenshteinDistance implements Callable<DistanceObject> {
|
|
|
|
|
|
|
|
private CharSequence lhs;
|
|
|
|
private CharSequence rhs;
|
|
|
|
private DistanceObject dco;
|
2019-03-02 15:10:46 +01:00
|
|
|
|
|
|
|
private static int minimum(int a, int b, int c) {
|
|
|
|
return Math.min(Math.min(a, b), c);
|
|
|
|
}
|
|
|
|
|
2019-03-03 13:17:07 +01:00
|
|
|
public LevenshteinDistance(CharSequence lhs, CharSequence rhs, DistanceObject dco) {
|
|
|
|
this.lhs = lhs;
|
|
|
|
this.rhs = rhs;
|
|
|
|
this.dco = dco;
|
|
|
|
}
|
2019-03-02 15:10:46 +01:00
|
|
|
|
2019-03-03 13:17:07 +01:00
|
|
|
public LevenshteinDistance(CharSequence lhs, CharSequence rhs) {
|
|
|
|
this.lhs = lhs;
|
|
|
|
this.rhs = rhs;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int computeLevenshteinDistance() {
|
|
|
|
int[][] distance = new int[lhs.length() + 1][rhs.length() + 1];
|
2019-03-02 15:10:46 +01:00
|
|
|
for (int i = 0; i <= lhs.length(); i++) {
|
|
|
|
distance[i][0] = i;
|
|
|
|
}
|
|
|
|
for (int j = 1; j <= rhs.length(); j++) {
|
|
|
|
distance[0][j] = j;
|
|
|
|
}
|
|
|
|
for (int i = 1; i <= lhs.length(); i++) {
|
|
|
|
for (int j = 1; j <= rhs.length(); j++) {
|
|
|
|
distance[i][j] = minimum(
|
|
|
|
distance[i - 1][j] + 1,
|
|
|
|
distance[i][j - 1] + 1,
|
|
|
|
distance[i - 1][j - 1] + ((lhs.charAt(i - 1) == rhs.charAt(j - 1)) ? 0 : 1));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return distance[lhs.length()][rhs.length()];
|
|
|
|
}
|
2019-03-03 13:17:07 +01:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public DistanceObject call() {
|
|
|
|
try {
|
|
|
|
int[][] distance = new int[lhs.length() + 1][rhs.length() + 1];
|
|
|
|
|
|
|
|
for (int i = 0; i <= lhs.length(); i++) {
|
|
|
|
distance[i][0] = i;
|
|
|
|
}
|
|
|
|
for (int j = 1; j <= rhs.length(); j++) {
|
|
|
|
distance[0][j] = j;
|
|
|
|
}
|
|
|
|
for (int i = 1; i <= lhs.length(); i++) {
|
|
|
|
for (int j = 1; j <= rhs.length(); j++) {
|
|
|
|
distance[i][j] = minimum(
|
|
|
|
distance[i - 1][j] + 1,
|
|
|
|
distance[i][j - 1] + 1,
|
|
|
|
distance[i - 1][j - 1] + ((lhs.charAt(i - 1) == rhs.charAt(j - 1)) ? 0 : 1));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
dco.setDistance(distance[lhs.length()][rhs.length()]);
|
|
|
|
} catch (Exception ex) {
|
|
|
|
System.out.println("ex msg: " + ex.getMessage() + "\n");
|
|
|
|
dco.setDistance(100);
|
|
|
|
return dco;
|
|
|
|
}
|
|
|
|
return dco;
|
|
|
|
}
|
2019-03-02 15:10:46 +01:00
|
|
|
}
|