在arraylist中查找字符串的松散匹配

时间:2010-06-28 02:45:00

标签: java algorithm substring

我有一个巨大的数组列表,其中包含1000个条目,其中一个条目是“world”。而且,我有一个词“大世界”。我希望在arraylist中得到与“世界”相匹配的“大世界”这个词。

最具成本效益的方法是什么?我不能使用数组列表的.contains方法,如果我遍历所有1000个条目并按模式匹配它们将在性能方面非常昂贵。我正在使用Java。

您能告诉我这是最好的方法吗?

干杯, Ĵ

4 个答案:

答案 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)

如果您必须反复搜索列表,可能需要使用Collectionssort()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(); 
}