【问题标题】:Boyer-moore counting words javaBoyer-moore 数词 java
【发布时间】:2016-04-13 09:47:23
【问题描述】:

我在 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”并在最后返回它。发生的情况是,如果我手动给它输入一个模式和一些文本,它似乎就可以了:

模式:测试 text: "这个测试是测试测试 testtest" 结果: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 文件本身时少得多的数字。知道出了什么问题吗?

【问题讨论】:

    标签: java algorithm substring filereader boyer-moore


    【解决方案1】:

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

    要解决这个问题,您可以执行以下操作:

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

    【讨论】:

    • 首先感谢您的洞察力!我现在有 while ((line = input.readLine()) != null) 和附加行,现在它确实读取了更多正确的作品,但是文本编辑器搜索和这个搜索之间仍然存在细微差别,例如一个词即在文本编辑器中找到 302 次,在 java 中找到 299 次,知道细微差别是由什么引起的吗?
    • 请更新您上面的示例,以便其他人无需阅读此解决方案即可回答。
    猜你喜欢
    • 2011-06-21
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    相关资源
    最近更新 更多