Неправильно работает система исправления орфографических ошибок

Суть задания заключается в написании простенькой системы исправления орфографических ошибок. К примеру, введем: Карова дает малако каторае пъут дэти. По заданию, если какой-либо фрагмент текста, отличается от какого-либо корня одним символом, то заменить этот фрагмент на соответствующий корень слова. Собственно вот код:

    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 шт):

Автор решения: Hedg263

Проблема заключалась в методе 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;
    }
}
→ Ссылка