Неправильно работает система исправления орфографических ошибок
Суть задания заключается в написании простенькой системы исправления орфографических ошибок. К примеру, введем: Карова дает малако каторае пъут дэти. По заданию, если какой-либо фрагмент текста, отличается от какого-либо корня одним символом, то заменить этот фрагмент на соответствующий корень слова. Собственно вот код:
public static void main(String[] args) {
String inputText = "Карова дает малако каторае пъут дэти";
List<String> roots = Arrays.asList("коров", "да", "молок", "котор", "пь", "дет");
String correctedText = correct(inputText, roots);
System.out.println(correctedText);
}
public static String correct(String text, List<String> roots) {
String[] words = text.split("\\s+");
StringBuilder correctedText = new StringBuilder();
for (String word : words) {
String closestRoot = find(word, roots);
correctedText.append(closestRoot).append(" ");
}
return correctedText.toString().trim();
}
public static String find(String word, List<String> roots) {
int minDifference = Integer.MAX_VALUE;
String closestRoot = word;
for (String root : roots) {
int difference = difference(word, root);
if (difference < minDifference) {
minDifference = difference;
closestRoot = root;
}
}
return closestRoot;
}
public static int difference(String word, String root) {
int difference = 0;
int minLength = Math.min(word.length(), root.length());
for (int i = 0; i < minLength; i++) {
if (word.charAt(i) != root.charAt(i)) {
difference++;
}
}
difference += Math.abs(word.length() - root.length());
return difference;
}
Выводился результат: коров да молок котор пь дет.
Как я понял, ошибка крылась в функции correct, внес изменения:
public static String correct(String text, List<String> roots) {
String[] words = text.split("\\s+");
StringBuilder correctedText = new StringBuilder();
for (String word : words) {
String closestRoot = find(word, roots);
int difference = difference(word, closestRoot);
if (difference == -1) {
correctedText.append(word).append(" ");
} else {
int res = difference;
StringBuilder correctedWord = new StringBuilder(word);
if (res < closestRoot.length()) {
correctedWord.setCharAt(res, closestRoot.charAt(res));
}
correctedText.append(correctedWord).append(" ");
}
}
return correctedText.toString().trim();
}
Теперь заменило только 1 символ в слове малако на малОко, что неправильно, ведь в слове 2 символа отличаются от правильного корня. Как сделать исправление корректно?
Ответы (1 шт):
Проблема заключалась в методе difference
. Теперь программа работает корректно:
public class Spell {
public static void main(String[] args) {
String inputText = "Карова дает малако каторае пъут дэти";
List<String> roots = Arrays.asList("Коров", "да", "молок", "апельсин", "котор", "пь", "дет");
String correctedText = correct(inputText, roots);
System.out.println(correctedText);
}
public static String correct(String text, List<String> roots) {
String[] words = text.split("\\s+");
StringBuilder correctedText = new StringBuilder();
for (String word : words) {
String correctedWord = find(word, roots);
correctedText.append(correctedWord).append(" ");
}
return correctedText.toString().trim();
}
public static String find(String word, List<String> roots) {
for (String root : roots) {
int diffIndex = difference(word, root);
if (diffIndex != -1) {
return root + word.substring(root.length());
}
}
return word;
}
public static int difference(String word, String root) {
if (Math.abs(word.length() - root.length()) > 1) {
return -1;
}
int differences = 0;
int index = -1;
for (int i = 0; i < Math.min(word.length(), root.length()); i++) {
if (word.charAt(i) != root.charAt(i)) {
differences++;
index = i;
if (differences > 1) {
return -1;
}
}
}
if (differences == 1 || word.length() != root.length()) {
return index;
}
return -1;
}
}