迭代一个巨大的列表更好的替代方法



我有一个文本输入,用户在其中输入一个搜索词,我将这个搜索词拆分为一个字符串数组,搜索列表项的名称&使用这些搜索词的描述。这是我的代码,但它在我的设备上运行得很慢。(我仔细检查了慢度来自for each循环,而不是RecyclerView(。有人能给我举一个更好/更快的替代方案的好例子吗?

ArrayList<CustomItem> original_list = getListFromDatabase();
ArrayList<CustomItem> filtered_list = new ArrayList<>();
String input_word = search_word.trim().toLowerCase(); // search_word is assigned by an input field
String[] parts = input_word.split(" ");
if (original_list != null) {
for (CustomItem item : original_list) {
int number = 0;
for (String part : parts) {
if (item.getName().toLowerCase().contains(part) || item.getDescription().toLowerCase().contains(part)) {
++number;
}
}
if (number == parts.length) filtered.add(item);
}
}
// lastly I assign my filtered list to a RecyclerView
if (adapter != null) adapter.search(filtered);

有一些简单的事情,例如:为每个项目重复调用toLowerCase()。你应该在内环之前做一次

但除此之外,除了(潜在的(使用多个线程并行处理数据的多个部分之外,剩下的就不多了。但这对CPU速度较慢的小型设备没有帮助。

除此之外,其他解决方案还需要后退一步:有时您必须设计完整的数据模型来支持最关键的性能用例。如果上面的计算经常发生,那么已经存储小写字符串可能会很有用,以避免以后这样做的开销

或者,您可能需要研究服务器端解决方案,其中大部分数据位于服务器上,并在所述服务器上应用全文搜索引擎来完成繁重的工作。

所以,很明显,有很多选择,你应该做什么取决于你的环境、需求和资源!

您可以考虑,并行流本身并检查性能差异。由于您实现的功能确实需要任何顺序的处理。。

original_list.parallelStream()... 

在此之后,过滤或执行forEach。。如你所愿。

希望这能有所帮助。干杯

最新更新