Бойер-Мур считает слова Ява

У меня есть задание в java, где я должен использовать решение поиска подстрок Бойера-Мура в Sedgewick: http://algs4.cs.princeton.edu/53substring/BoyerMoore.java.html

Теперь оно остановится, когда будет найдено первое вхождение слова, и вернет место, где оно найдено. Поэтому для подсчета слов я изменил метод поиска на:

public String search(String txt) {
        int M = pat.length();
        int N = txt.length();
        int count = 0;
        int skip = 0;
        int charCount = 0;
        for (int i = 0; i <= N - M; i += skip) {
            skip = 0;
            for (int j = M-1; j >= 0; j--) {
                if (pat.charAt(j) != txt.charAt(i+j)) {
                    skip = Math.max(1, j - right[txt.charAt(i+j)]);
                    break;
                }
                charCount++;
            }
            if (skip == 0)
            {
                count++;
                skip++;
            }
        }
        return "Aantal char: " + charCount + "\n" + count;                      
    }

Я изменил оператор if skip, чтобы запустить счетчик "count" и вернуть его в конце. Что произойдет, если я передам шаблон и какой-нибудь текст от руки, это будет хорошо выглядеть так:

pattern: test text: "этот тест - тестовый тестовый тестовый результат": 5

Однако мне нужно прочитать в текстовом файле некоторый текст около 70 тыс. Слов и поиск подстроки, что:

        BufferedReader input = new BufferedReader(new FileReader(System.getProperty("user.home") + "/Desktop/opdr3tekst.txt"));
        StringBuilder stringBuilder = new StringBuilder();

        while(input.readLine() != null)
        {
            stringBuilder.append(input.readLine());
        }
        input.close();

        BoyerMoore boyer = new BoyerMoore("pattern to search");


        System.out.println(boyer.search(stringBuilder.toString()));

Поэтому, когда я ищу слово, я всегда получаю число, которое намного меньше, чем когда я CMD+F сам файл в текстовом редакторе Mac. Есть идеи, что не так?

1 ответ

Вы пропускаете строки из файла, когда он читается. Именно из-за этого while(input.readLine() != null), Строка, прочитанная при выполнении этого оператора, никогда не добавляется в StringBuilder

Чтобы это исправить, вы можете сделать что-то вроде этого:

for(String line;(line = input.readLine())!=null;){
     stringBuilder.append(line);
}
Другие вопросы по тегам