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?