1

问题描述


我有字符串列表,其中包含 8000 个项目。包含列表的项目如下所述。

List<String> stringList = new List<String>(8000);
stringList.add("this is first string.");
stringList.add("text which I want to search.");
stringList.add("separated string items.");
....

所以你可以看到我列表中的每个项目都是一个包含三个以上单词的句子。

问题。


外部用户可以通过以下方式搜索列表。例如用户想要搜索单词“ first ”,搜索算法必须以这种方式工作。

搜索算法必须遍历列表并将单词“ first ”与句子中的所有单词进行比较,如果句子中的任何单词以“ first ”开头,它必须返回该句子。所以为了实现这个算法,我编写了以下代码,你可以在下面看到代码。

我实现的算法运行速度很慢,所以我想知道是否有更快的算法或如何使我的算法更快?

代码示例


Iterator<ContactInformation> stringListIter  = stringList .iterator();
while (stringListIter.hasNext()) {
            
    String currItem = stringListIter.next();
    String[] separatedStr = currItem.split(" ");

    for(int i=0; i<separatedStr.lenght; ++i)
        if(separatedStr[i].startsWith(textToFind))
            retList.add(currItem);  
}
4

4 回答 4

2

我会持有一个Map<String, Set<Integer>>其中每个单词都是键,值是包含该单词的句子的索引。

于 2013-05-02T07:34:42.850 回答
2

您可以使用该String#contains方法String#startsWith而不是拆分String并搜索每个令牌。

String currItem = stringListIter.next();
if(currItem.startsWith(textToFind.concat(space))){
    retList.add(currItem);
} else if(currItem.endsWith(space.concat(textToFind))){
    retList.add(currItem);
} else if(currItem.contains(space.concat(textToFind).concat(space))){
    retList.add(currItem);
} else if(currItem.equals(textToFind)){
    retList.add(currItem);
}

First if- 检查它是否是第一个单词。

第二if- 检查它是否是最后一个词。

第三if- 检查它是否在中间的某个地方。

Last if- 检查它是否是唯一的词。

于 2013-05-02T07:35:42.533 回答
1

一个非常适合Lucene的任务。

于 2013-05-02T07:55:44.700 回答
1
for(String s : yourList){
    if(s.contains(textToFind)){
        retList.add(s);
    }
}
于 2013-05-02T08:34:55.693 回答