如何将查询订单状态的Java方法改写为使用HashMap实现?
用HashMap优化getOrdersByState方法时的报错解决
需求背景
作业要求将原getOrdersByState方法改写为使用HashMap提升效率,原方法功能是根据传入的状态(比如"shipped")返回所有对应状态的订单列表。
原代码如下:
// public ArrayList<Order> getOrdersByState(String inState ){ // //ToDo: Rewrite this method to be more efficent and use a hash // ArrayList<Order> retOrder = new ArrayList<>(); // //boolean firstLine = true; // for( Order o : orders ){ // if ( o.getStatus().equals(inState) ){ // retOrder.add(o); // } // } // return retOrder; // }
遇到的问题
自己写的代码中,map.put(inState, o)的参数o报红错误,代码如下:
public ArrayList<Order> getOrdersByState(String inState ) { //ToDo: Rewrite this method to be more efficent and use a hash ArrayList<Order> retOrder = new ArrayList<>(); HashMap<String, List<Order>> map = new HashMap<>(); boolean firstLine = true; for (Order o : orders) { if (firstLine) { firstLine = false; continue; } if (map.containsKey(inState)) { map.put(inState,o); } } return retOrder; }
错误原因与修正方案
错误原因
- 类型不匹配:你定义的HashMap泛型是
<String, List<Order>>,意味着value必须是List<Order>类型,但你直接传入单个Order对象o,类型不兼容,所以报错。 - 逻辑完全错误:
- 没有按订单状态分组,反而只判断传入的
inState是否存在,根本没把订单数据存入map; - 最终返回的
retOrder是空列表,完全没用到map中的数据; - 遍历订单时,跳过第一个元素后,后续逻辑没有处理任何订单的分组操作。
- 没有按订单状态分组,反而只判断传入的
正确实现
要真正提升效率,应该提前把所有订单按状态分组存入HashMap(作为类成员变量,只初始化一次),后续调用方法时直接从map中取结果,避免每次调用都遍历全量订单。
代码示例:
// 类成员变量:按状态分组存储订单,只初始化一次 private Map<String, List<Order>> ordersByState; // 初始化分组方法(可在构造函数或订单加载完成后调用) private void initOrdersByState() { ordersByState = new HashMap<>(); boolean firstLine = true; for (Order o : orders) { if (firstLine) { firstLine = false; continue; // 跳过CSV表头对应的Order对象 } String orderState = o.getStatus(); // 若当前状态不存在于map中,自动创建空列表;然后将订单加入对应列表 ordersByState.computeIfAbsent(orderState, k -> new ArrayList<>()).add(o); } } // 优化后的查询方法 public ArrayList<Order> getOrdersByState(String inState) { // 确保分组map已初始化 if (ordersByState == null) { initOrdersByState(); } // 取出对应状态的订单列表,若不存在则返回空列表 List<Order> resultList = ordersByState.getOrDefault(inState, new ArrayList<>()); // 返回新的ArrayList(避免外部修改原列表,根据需求可调整) return new ArrayList<>(resultList); }
关键说明
computeIfAbsent方法:简化了“判断key是否存在,不存在则创建value,再添加元素”的逻辑,代码更简洁;- 类成员变量的map:只在第一次调用时初始化,后续查询直接O(1)时间获取结果,真正实现了效率提升;
- 跳过表头的逻辑保留,适配CSV数据场景。
内容的提问来源于stack exchange,提问作者xkellss
相关产品推荐
相关产品推荐

