projects-jenz/ArtificialAutism/src/main/java/FunctionLayer/LevenshteinDistance.java

76 lines
2.4 KiB
Java
Raw Normal View History

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;
import java.util.Map;
import java.util.concurrent.Callable;
2019-03-02 15:10:46 +01:00
/**
*
* @author install1
*/
public class LevenshteinDistance implements Callable<Map.Entry<String, Integer>> {
private CharSequence lhs;
private CharSequence rhs;
private Map.Entry<String, Integer> distanceEntry;
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);
}
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()];
}
@Override
public Map.Entry<String, Integer> 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));
}
}
distanceEntry.setValue(distance[lhs.length()][rhs.length()]);
} catch (Exception ex) {
System.out.println("ex msg: " + ex.getMessage() + "\n");
return null;
}
return distanceEntry;
}
2019-03-02 15:10:46 +01:00
}