我有一个巨大的数组列表,其中包含1000个条目,其中一个条目是“world”。而且,我有一个词“大世界”。我希望在arraylist中得到与“世界”相匹配的“大世界”这个词。
最具成本效益的方法是什么?我不能使用数组列表的.contains方法,如果我遍历所有1000个条目并按模式匹配它们将在性能方面非常昂贵。我正在使用Java。
您能告诉我这是最好的方法吗?
干杯, Ĵ
答案 0 :(得分:1)
假设你不知道arraylist元素的内容。你将不得不遍历整个arraylist。
遍历arraylist会花费你O(n)。
对arraylist进行排序无助于您,因为您正在讨论在一组字符串中搜索字符串。仍然排序会更昂贵。 O(nlogn)
答案 1 :(得分:1)
您可以将ArrayList
的每个元素拆分为单词,并在找到其中一个元素后立即停止。
我想你的个人资料是用Java开发的,Lucene你很容易做到这样的事情
public class NodesAnalyzer extends Analyzer {
public TokenStream tokenStream(String fieldName, Reader reader) {
Tokenizer tokenizer = new StandardTokenizer(reader)
TokenFilter lowerCaseFilter = new LowerCaseFilter(tokenizer)
TokenFilter stopFilter = new StopFilter(lowerCaseFilter, Data.stopWords.collect{ it.text } as String[])
SnowballFilter snowballFilter = new SnowballFilter(stopFilter, new org.tartarus.snowball.ext.ItalianStemmer())
return snowballFilter
}
}
Analyzer analyzer = new NodesAnalyzer()
TokenStream ts = analyzer.tokenStream(null, new StringReader(str));
Token token = ts.next()
while (token != null) {
String cur = token.term()
token = ts.next();
}
注意:这是我从个人项目中复制的Groovy代码,因此您必须将Data.stopWords.collect{ it.text } as String[]
之类的内容翻译为与普通Java一起使用
答案 2 :(得分:0)
如果您必须反复搜索列表,可能需要使用Collections
的sort()
和binarySearch()
方法。
附录:如@ user177883所述,必须权衡 O(n log n)排序的成本与后续 O(log n)搜索的好处
“heart”一词与[word]“ear”匹配。
由于完全匹配不足,这种方法是不够的。
答案 3 :(得分:0)
我有一个非常类似的问题。
使用此if
/ else if
声明解决了这个问题。
if (myArrayList.contains(wordThatIsEntered)
&& wordThatCantBeMatched.equals(wordThatIsEntered)) {
Toast.makeText(getApplicationContext(),
"WORD CAN'T BE THE SAME OR THAT WORD ISN'T HERE",
Toast.LENGTH_SHORT).show();
}
else if (myArrayList.contains(wordThatIsEntered)) {
Toast.makeText(getApplicationContext(),
"FOUND THE EXACT WORD YOU ARE LOOKING FOR!",
Toast.LENGTH_SHORT).show();
}