【问题标题】:Most efficient and quick search over Array List对数组列表进行最有效和快速的搜索
【发布时间】:2018-06-04 07:14:45
【问题描述】:

我正在尝试遍历 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;
}

【问题讨论】:

  • 使用Map&lt;String,FoodItem&gt; 而不是List
  • 为什么不使用 HashMap?

标签: java search arraylist


【解决方案1】:

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

对于从 ListMap 的转换,您可以使用 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
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      并行流可能会有所帮助

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

      它返回Optional&lt;FoodItem&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-01
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 2012-11-30
        相关资源
        最近更新 更多