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