2016-02-10 29 views
0

我正在研究方法,其中getOrdersForCustomer方法的返回类型为Map<Integer, List<Order>>,并且每个customerId(地图的整数)都需要在遍历订单列表时使用它们各自的订单。订单已与客户ID相关联。我结束了以下情况:如何匹配地图返回类型的键和值?

public Map<Integer, List<Order>> getOrdersForCustomer(Company company) { 

    List<Order> orders = orderDao.findAll(company); 
    Map<Integer, List<Order>> map = new HashMap<>(); 

    for(Order order: orders){ 

     int customerId = order.getCustomerId(); 
     if(map.get(customerId).size() ==0){ 

      map.put(customerId, new ArrayList<Order>()); 
     } 

     else{ 

      map.get(customerId).add(order); 
     } 
    } 

    return map; 
} 

如何纠正代码都正常工作?

回答

1

我假设你在这里得到一个NPE?

if(map.get(customerId).size() ==0){ 

务必:

if (!map.contains(customerId)) { 
+0

感谢您的回答,这会有所帮助。 – Arefe

1

您需要解决此问题的检查。如果customerId不在地图中,您将得到空指针异常。

if(map.get(customerId).size() ==0) { 
    map.put(customerId, new ArrayList<Order>()); 
    } 

该逻辑也是不正确的。您尚未将订单添加到您添加的列表中。您可以将订单添加到列表构造函数中或删除else语句。

2

看起来好像第一个Order对象不会被添加到Map中的List中。我相信你应该总是在每次迭代中添加以下代码:

(Order order:orders) {customerId = order.getCustomerId();

if(map.get(customerId).size() ==0){ 

     map.put(customerId, new ArrayList<Order>()); 
    } 

    map.get(customerId).add(order); 
} 
0

是的,有一个在逻辑错误,我纠正它由@djechlin如下建议,

@Override 
public Map<Integer, List<Order>> getOrdersForCustomer(Company company) { 

    List<Order> orders = orderDao.findAll(company); 
    Map<Integer, List<Order>> map = new HashMap<>(); 

    for(Order order: orders){ 

     int customerId = order.getCustomerId(); 
     if(!map.containsKey(customerId)){ 

      map.put(customerId, new ArrayList<Order>()); 
     } 

     map.get(customerId).add(order); 
    } 

    return map; 
}