Boyer-moore计数词java

时间:2016-01-08 16:25:51

标签: java algorithm substring filereader boyer-moore

我在java中有一个作业,我必须使用Sedgewick的Boyer Moore子串搜索解决方案: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”并在结束时返回它。会发生什么,如果我用手喂它一个模式和一些文本它似乎很好,所以:

模式:测试 文字:“这个测试是一个测试测试测试” 结果:5

但是我需要在一个大约70k字的文本和子字符串搜索的txt文件中读取:

        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()));

因此,当我搜索一个单词时,我总是会得到一个比我在Mac文本编辑器中使用CMD + F文件本身少得多的数字。知道出了什么问题吗?

1 个答案:

答案 0 :(得分:1)

您正在读取文件时从文件中删除行。那是因为while(input.readLine() != null)。执行此语句时读取的行永远不会添加到StringBuilder

要解决这个问题,你可以这样做:

for(String line;(line = input.readLine())!=null;){
     stringBuilder.append(line);
}