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