搜索一组字符串包含Java中ArrayList的特定字符串

时间:2014-01-14 02:54:30

标签: java string search arraylist

是否有任何快速算法在String的Arraylist中搜索特定字符串?

例如:

我有一个Arraylist:

{"white house","yellow house","black door","house in heaven","wife"}

想要搜索包含" house"的字符串。 它应该在最短的时间内返回{"white house","yellow house","house in heaven"}。 我的意思是我的问题是处理没有索引的大数据(大约167000个字符串的列表)。

谢谢!

2 个答案:

答案 0 :(得分:1)

您的问题有两个答案,具体取决于您是否计划运行多个查询:

  • 如果您只需要运行一次查询,那就不顺利了:您必须从头到尾搜索整个数组。
  • 如果您需要运行大量查询,可以通过构建索引来减少工作量。

制作数据结构Map<String,List<String>>,浏览List<String>中的字符串,然后将其拆分为单词。对于令牌列表中的每个单词,将原始字符串添加到相应的列表中。

此操作在O(N*W)中运行,其中N是长字符串的数量,W是每个字符串的平均字数。有了这样的地图,您可以在O(1)中运行查询。

请注意,只有当查询数量明显超过每个字符串中的平均字数时,此方法才会获得回报。例如,如果您的字符串平均有10个单词,并且您需要运行5到8个查询,则线性搜索会更快。

答案 1 :(得分:1)

我同意Josh Engelsma的观点。迭代列表并逐个检查是最简单的方法。并且167000实际上不是一个非常大的数据,除非List中的每个String都很长。衬垫搜索算法可以在普通PC中仅几秒完成。

考虑编码约定,代码可能是这样的:

for(String s : list) {
    if(s.contains.("house")) {
        //do sth.
    }
}

如果搜索将在具有不同关键字的同一列表上多次执行,则可以构建反向索引以加快搜索速度。

在你的例子中:

{"white house","yellow house","black door","house in heaven","wife"}

您可以预处理列表,将每个句子分成单词,并构建索引,如:

"house" --> {0,1,3}
"white" --> {0}
"yellow" --> {1}
...

表示“house”包含在列表的第0和第3个元素中,依此类推。索引可以使用HashMap实现:

Map<String, LinkedList<Integer>> = new HashMap<String, LinkedList<Integer>>();

理想情况下,搜索操作将加速到O(1)复杂度。