Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.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_List_For Loop - Fatal编程技术网

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

Java 迭代一个巨大的列表是更好的替代方法,java,android,list,for-loop,Java,Android,List,For Loop,我有一个文本输入,用户在其中输入一个搜索词,我将这个搜索词拆分成一个字符串数组,使用这些搜索词搜索列表项的名称和描述。这是我的代码,但它在我的设备上运行非常慢。(我仔细检查了慢度是否来自每个循环的,而不是回收视图)。有人能给我举一个更好/更快的选择的好例子吗 ArrayList<CustomItem> original_list = getListFromDatabase(); ArrayList<CustomItem> filtered_list = new A

我有一个文本输入,用户在其中输入一个搜索词,我将这个搜索词拆分成一个字符串数组,使用这些搜索词搜索列表项的名称和描述。这是我的代码,但它在我的设备上运行非常慢。(我仔细检查了慢度是否来自每个循环的
,而不是
回收视图
)。有人能给我举一个更好/更快的选择的好例子吗

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);
ArrayList original_list=getListFromDatabase();
ArrayList filtered_list=新建ArrayList();
字符串输入\u word=search\u word.trim().toLowerCase();//搜索词由输入字段指定
String[]parts=input_word.split(“”);
if(原始列表!=null){
用于(CustomItem项目:原始清单){
整数=0;
用于(字符串部分:部分){
if(item.getName().toLowerCase()包含(部分)| | item.getDescription().toLowerCase()包含(部分)){
++数量;
}
}
如果(数字==零件长度)已过滤。添加(项目);
}
}
//最后,我将筛选列表分配给RecyclerView
if(adapter!=null)adapter.search(过滤);

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

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

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

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


因此,显然,有很多选择,您应该做什么取决于您的环境、需求和资源

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

original_list.parallelStream()... 
在此之后,请选择筛选或执行forEach。。如你所愿


希望这有帮助。干杯

慢度来自
item.getName().toLowerCase()和
item.getDescription().toLowerCase()的
toLowerCase()
。对于每个迭代,它需要在内存中生成一个小写的新字符串。想一些办法来避免这种情况。一种方法是保留一个小写的列表。我从没想过这段小代码会导致这一切。现在的差别真的很大!谢谢。显然,这是启用多线程的“简单”方法。但老实说:为了真正有价值,我们必须看很多细节。它从流上实际发生的处理开始。还有这样的问题:并行处理真的可能吗。除此之外,
parallelStream()
带来了大量的开销,功能较弱的Android设备在使用它时可能会给您带来更糟糕的运行时间……我实际上已经提到,如果不需要顺序或顺序,那么parallelStream是一个不错的选择。事实上,我提到要尝试一下,但没有提到这是一个完美的解决方案大多数时候,仅仅说“试试这个”并不是一个好的“答案”。。。。