最有效和快速搜索阵列列表

时间:2018-06-04 07:14:46

标签: java search arraylist

我正在尝试迭代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;
}

3 个答案:

答案 0 :(得分:1)

正如@Eran在评论中已经提到的那样。关于使用Map进行查找,使用Id可能是最佳选择。

要从List转换为Map,您可以使用Java8 Stream API:

Map<String, FoodItem> 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
}

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

可能并行流将有助于

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

返回Optional<FoodItem>