java - 我可以为这个循环提供更快的性能吗?

标签 java performance loops

我正在读一本书并从中删除了一些单词。我的问题是这个过程需要很长时间,我想让它的性能更好(更少的时间),例如:

Vector<String> pages = new Vector<String>();  // Contains about 1500 page, each page has about 1000 words.
Vector<String> wordsToDelete = new Vector<String>();  // Contains about 50000 words.

for( String page: pages ) {
    String pageInLowCase = page.toLowerCase();

    for( String wordToDelete: wordsToDelete ) {
        if( pageInLowCase.contains( wordToDelete ) )
            page = page.replaceAll( "(?i)\\b" + wordToDelete + "\\b" , "" );
    }

    // Do some staff with the final page that does not take much time.
}

执行此代码大约需要 3 分钟。如果我跳过 replaceAll(...) 的循环,我可以节省超过 2 分钟。 那么有没有办法以更快的性能执行相同的循环?

最佳答案

是的,您可以用不同的方式处理页面。基本思路如下

for (String word : page) {
    if (!forbiddenWords.contains(word)) {
        pageResult.append(word);
    }
}

这里的forbiddenWords是一个集合。
此外,for (String word : page) 是将页面解析为单词列表的简写形式。不要忘记在结果中添加空格(为清楚起见,我跳过了它)。

原始版本处理一页的复杂度为~50000*1000,而现在只有~1000。 (检查单词是否在 HashSet 中需要常数时间)

编辑
因为我想转移自己十分钟的时间,所以这里是代码:)

    String text = "This is a bad word, and this is very bad, terrible word.";
    Set<String> forbiddenWords = new HashSet<String>(Arrays.asList("bad", "terrible"));

    text += "|"; // mark end of text
    boolean readingWord = false;
    StringBuilder currentWord = new StringBuilder();
    StringBuilder result = new StringBuilder();

    for (int pos = 0; pos < text.length(); ++pos) {
        char c = text.charAt(pos);
        if (readingWord) {
            if (Character.isLetter(c)) {
                currentWord.append(c);
            } else {
                // finished reading a word
                readingWord = false;
                if (!forbiddenWords.contains(currentWord.toString().toLowerCase())) {
                    result.append(currentWord);
                }

                result.append(c);
            }
        } else {
            if (Character.isLetter(c)) {
                // start reading a new word
                readingWord = true;
                currentWord.setLength(0);
                currentWord.append(c);
            } else {
                // append punctuation marks and spaces to result immediately
                result.append(c); 
            }
        }
    }

    result.setLength(result.length() - 1); // remove end of text mark
    System.out.println(result);

关于java - 我可以为这个循环提供更快的性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4535269/

相关文章:

java - AspectJ 错误 : Could not find or load main class aop.

java - 在方法内部的 super 引用之前显示字段/变量 :JAVA

java - while 循环在每次迭代后不更新 i

c++ - 将数据从循环存储到数组

java - Spring数据存储库junit测试

java - Java 中的泛型 - 使用抽象类进行类型删除

sql - 从选择性能 SQL Server 插入

C#:为什么函数调用比手动内联更快?

java - VTD XML (Java) VTDNavHuge 将 XPath 结果写入文件

C++ 为什么我的循环中断了?