请建议我使用
删除非英语单词和阻止错误单词的最佳Java API我使用英文单词列表文件来解析给定的字符串。代码响应非常缓慢。 `
String englishword;
while ((englishword = br.readLine()) != null) {
//System.out.println("@"+englishword);
for (String word : wordsArray) {
//System.out.println("#"+word);
if(englishword.trim().toUpperCase().equals(word.trim().toUpperCase()))
{
linetmp = linetmp.replaceAll(word, " ").trim();
break;
}
}
}
if(linetmp!=null)
for(String nonEnglish:linetmp.split("\\s+"))
{
line = line.replaceAll(nonEnglish, "");
}
line = line.replaceAll(" +", " ");
return line;
如果有更快的方法,请建议我
注意:我正在使用Linux OS的字典listy
答案 0 :(得分:0)
在for (String word : wordsArray)
周期之外,仅对选中字的trim()和touppercase()进行一次。
如果你在内循环中做过多的重操作,没有API会帮助你。
您可以使用Java API函数进行搜索
import org.apache.commons.lang.ArrayUtils;
ArrayUtils.indexOf(array, string);
答案 1 :(得分:0)
您可以通过将wordsArray
更改为HashSet
并使用contains(String)
方法进行检查,使代码更快 1 。 (确保在构建集合时将单词转换为大写。)
但是,我会指出这种方法并不适合。列举所有可能的"非英语或不正确的"是不切实际的。话。你最好建立一个包含你准备接受的所有单词的集合,然后删除不在集合中的单词。
1 - 目前,您的内部循环需要的时间与N
中的单词数量wordArray
)成正比;即O(N)
。如果您使用HashSet
,则操作需要O(1)
次;即大致恒定的时间。
答案 2 :(得分:0)
有一种更快的方式。
创建一个HashSet<String>
,其中包含wordsArray
中的所有元素(作为小写/大写)。
对于每个新词englishword
,请检查set.contains(englishword.toLowerCase())
。
此解决方案在O(n|S|)
预处理(创建HashSet)中运行,并且检查每个单词是O(|S|)
,其中|S|
是字符串的长度,n
是数组中的单词数,而你的解决方案基本上是每个单词O(n | S |)。
代码快照:
public static class EnglishChecker {
private final Set<String> set;
public EnglishChecker(String[] englishWords) {
set = new HashSet<>();
for (String s : englishWords) {
set.add(s.toLowerCase());
}
}
public boolean isWord(String s) {
return set.contains(s.toLowerCase());
}
}
public static void main(String[] args) {
String[] words = { "Cat", "dog", "mousE" };
EnglishChecker checker = new EnglishChecker(words);
System.out.println(checker.isWord("cat"));
System.out.println(checker.isWord("cccccccat"));
System.out.println(checker.isWord("MOUSE"));
}