我有一个大约{50,000}记录的list<String>
。我想要一种有效的方法来搜索subString
中的特定List
并获取包含该Strings
的{{1}}。
到目前为止,我的代码是这样的:
subString
答案 0 :(得分:1)
这取决于有效的含义。
如果你想获得“最小”的CPU使用率,那么你无能为力:你必须迭代该列表;并比较所有条目。 不唯一明显的做法是:为每个循环体调用tag.toLowerCase()
。在进入循环之前,只需计算一次的值!
如果你关心在更短的时间内获得结果,答案很简单:使用多个线程,并让每个线程搜索整个列表的“切片”(当然,这可能很快变得复杂,因为你现在必须保留秩序和其他微妙的东西。)
最后:您可能希望查看ElasticSearch这样的工具 - 因为有各种产品专门用于实现这一目标:搜索巨大数量的文本。
答案 1 :(得分:0)
考虑使用SQL数据库来保存大量数据。
通过这种方式,您可以使用简单查询来获取包含子字符串的结果String(请参见下面的示例)。此外,您的内存将没有加载到列表中的数据量。
e.g。
SELECT * from word_list_table WHERE word LIKE'%substring%'
答案 2 :(得分:0)
如果您的处理器有多个核心,请使用并行流。
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
如果您的处理器有多个核心,上面的代码将更快地处理您的字符串,因为打开了并行流。