Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在大列表中搜索子字符串-Java_Java_Android - Fatal编程技术网

如何在大列表中搜索子字符串-Java

如何在大列表中搜索子字符串-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

我有一张大约50000张唱片的大名单。我需要一种有效的方法来搜索该列表中的特定子字符串,并获取包含该子字符串的字符串

到目前为止,我的代码是这样的:

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