如何在大列表中搜索子字符串-Java
我有一张大约50000张唱片的大名单。我需要一种有效的方法来搜索该列表中的特定子字符串,并获取包含该子字符串的字符串 到目前为止,我的代码是这样的:如何在大列表中搜索子字符串-Java,java,android,Java,Android,我有一张大约50000张唱片的大名单。我需要一种有效的方法来搜索该列表中的特定子字符串,并获取包含该子字符串的字符串 到目前为止,我的代码是这样的: List<String> result = new ArrayList<>(); if (aCondition) { for (String file : arg) { if (file.toLowerCase().contains(tag.toLowerCase())) { result.add(file
List<String> result = new ArrayList<>();
if (aCondition) {
for (String file : arg) {
if (file.toLowerCase().contains(tag.toLowerCase())) {
result.add(file);
}
}
}
return result;
这取决于你所说的有效 如果您想将CPU使用率降到最低,那么您所能做的就不多了:您必须迭代该列表;并比较所有条目。唯一明显不能做的事情是:为每个循环体调用tag.toLowerCase。只需在进入循环之前计算该值一次 如果你想在更短的时间内得到结果,答案很简单:使用多个线程,让每个线程搜索整个列表的一部分,当然,这会很快变得复杂,因为你现在必须保持秩序和其他微妙的事情
最后:您可能需要研究一些工具,例如,有各种各样的产品专门用于搜索大量文本。考虑使用SQL数据库来保存大量数据 通过这种方式,您可以使用一个简单的查询来获得一个包含子字符串的结果字符串,请参见下面的示例。此外,您的内存将不会有列表中加载的数据量 e、 g 如果您的处理器有多个内核,只需使用并行流即可
如果您的处理器有多个内核,因为并行流被打开,那么上面的代码将更快地处理字符串。请参阅此处的第二个答案:了解一些解释。我想在android设备上执行此操作,这样它就不会使用大量ram或cpu,但我需要尽可能快地处理GhostCat提到的问题,您可能会寻找这些问题专业产品:也应该是一个适用的解决方案Elasticsearch基于Lucene。与Elasticsearch相比,它应该更加轻量级,并且您可能会受益于它的反向索引方法。你也可以检查一下,它提到了全文搜索
SELECT * from word_list_table WHERE word LIKE'%substring%'
List<String> result = lines.parallelStream() //convert list to parallel stream
.filter(line -> file.toLowerCase().contains(tag.toLowerCase())) // check your condition
.collect(Collectors.toList()); // collect output