遍历大量列表,这是一种更好的替代方法

时间:2018-11-04 10:46:50

标签: java android list for-loop

我有一个文本输入,用户可以在其中输入搜索词,然后将该搜索词分成一个字符串数组,然后使用这些搜索词搜索列表项的名称和描述。这是我的代码,但是在我的设备上运行速度非常慢。 (我仔细检查了速度慢是由于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);

2 个答案:

答案 0 :(得分:2)

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

但是,除此之外,剩下的就是(并行)使用多个线程来并行处理数据的多个部分。但这在CPU速度较慢的小型设备上无济于事。

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

或者,您可能不得不研究服务器端解决方案,其中许多数据驻留在服务器上,并且您在该服务器上应用了全文搜索引擎来完成繁重的工作。

因此,显然,有很多选择,您应该做什么取决于您的上下文,需求和资源!

答案 1 :(得分:0)

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

original_list.parallelStream()... 

在该过滤器之后或根据需要执行forEach..。

希望这会有所帮助。干杯!!!