Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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_Search_Arraylist - Fatal编程技术网

Java 对数组列表进行最高效、最快速的搜索

Java 对数组列表进行最高效、最快速的搜索,java,search,arraylist,Java,Search,Arraylist,我试图迭代一个ArrayList,想找出一个元素。在清单中有上千个项目,所以要花很多时间才能找到。因此,请任何人建议高效和快速的搜索。代码如下: private FoodItem getFoodItem(List<FoodItem> foodItemList, String foodItemId) { if (foodItemId == null || foodItemList == null || foodItemList.isEmpty()) { retu

我试图迭代一个
ArrayList
,想找出一个元素。在清单中有上千个项目,所以要花很多时间才能找到。因此,请任何人建议高效和快速的搜索。代码如下:

private FoodItem getFoodItem(List<FoodItem> foodItemList, String foodItemId) {
    if (foodItemId == null || foodItemList == null || foodItemList.isEmpty()) {
        return null;
    }
    for (FoodItem foodItem : foodItemList) {
        if (foodItem == null) {
            continue;
        }
        if (foodItem.getId().equals(foodItemId)) {
            return foodItem;
        }
    }
    return null;
}
private FoodItem getFoodItem(列出foodItemList,字符串foodItemId){
if(foodItemId==null | | foodItemList==null | | foodItemList.isEmpty()){
返回null;
}
for(FoodItem FoodItem:foodItemList){
if(foodItem==null){
持续
}
if(foodItem.getId().equals(foodItemId)){
返回foodItem;
}
}
返回null;
}

如果您需要一个列表,您可能希望在插入时对其进行排序(取决于您执行的插入次数与搜索次数,因为顺序插入当然较慢),然后执行一些二进制搜索


或者更好的方法是,如果您不需要列表,可以使用HashMap(如果您需要可预测的顺序,甚至可以使用LinkedHashMap)。

并行流可能会有所帮助

foodItemList.parallelStream().findAny(foodItem->foodItem.getId().equals(foodItemId))

它返回@Eran在注释中已经提到的
可选
。关于使用
Id
进行查找,使用
Map
可能是最好的选择

要将
列表
转换为
映射
,可以使用Java8流API:

Map<String, FoodItem> map = foodList.stream()
    .collect(Collectors.toMap(FoodList::getId, Function.identity());
Map Map=foodList.stream()
.collect(Collectors.toMap(FoodList::getId,Function.identity());
注意:这应该只执行一次,而不是每次查找

然后使用查找:

public FoodItem getFoodItem(Map<String, FoodItem> map, String foodItemId){
    if (foodItemId == null || foodItemList == null || foodItemList.isEmpty()) {
        return null;
    }
    return map.get(foodItemId); // returns null if it doesn't exists
}
public FoodItem getFoodItem(映射映射,字符串foodItemId){
if(foodItemId==null | | foodItemList==null | | foodItemList.isEmpty()){
返回null;
}
return map.get(foodItemId);//如果不存在,则返回null
}

使用
映射
而不是
列表
。为什么不使用HashMap?