我有字符串列表,其中包含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);
}
答案 0 :(得分:2)
我会保持Map<String, Set<Integer>>
,其中每个单词都是一个键,值是包含该单词的句子的索引。
答案 1 :(得分: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);
}
首先if
- 检查它是否是第一个单词。
秒if
- 检查它是否是最后一个字。
第三if
- 检查它是否位于中间位置。
上次if
- 检查它是否是唯一的单词。
答案 2 :(得分:1)
完全适合Lucene的任务。
答案 3 :(得分:1)
for(String s : yourList){
if(s.contains(textToFind)){
retList.add(s);
}
}