2013-01-14 114 views
0

我想加载数据哈希映射的哈希映射,我不断收到空指针,不知道如果我做的权利事情。加载数据到HashMap <String,HashMap <String,HashMap <String,ArrayList <ClassOb> >>>

我希望我的哈希映射基于三个关键SalesAreaCode,year和product。我想将其余部分存储在arraylist中。我想通过销售区域代码,年份和产品,并列出与这三个关键字相关的所有产品,如客户,数量,价格: 我真的需要帮助或有人指向我正确的方向。任何帮助将不胜感激!!艾伦

代码:

public HashMap<String, HashMap<String, HashMap<String, ArrayList<Sales>>>> getSalesDetails(Connection con) 
{ 
     HashMap<String, HashMap<String, HashMap<String, ArrayList<Sales>>>>> hmpSales = 
     new HashMap<String, HashMap<String, HashMap<String, ArrayList<Sales>>>>>(); 
     Sales s; 
     HashMap<String,ArrayList<Sales>> hmpSalProd = new HashMap<String, ArrayList<Sales>>(); 
     HashMap<String,HashMap<String,ArrayList<Sales>>> hmpSalYear = 
     new HashMap<String, ArrayList<Sales>>>();  

     try 
     { 
      pst = con.prepareStatement(sql); 
     rs=pst.executeQuery(); 
     while(rs.next()) 
     { 
        s=new Sales(); 

        if(!(hmpSalProd.containskey(rs.getString("product")))) 
        { 
         s.setSalesCode(rs.getString("sacd")); 
         s.setCustomerCode(rs.getString("custcd")); 
         s.setYear(rs.getInt("year")); 
         s.setProduct(rs.getString("product")); 
         s.setPrice(rs.getDouble("price")); 
         s.setQty(rs.getInt("qty")); 
         hmpSalProd.put(rs.getString("product"), 
         new ArrayList<Sales>(Arrays.asList(s))); 
        } 
        else 
        { 
         s.setSalesCode(rs.getString("sacd")); 
         s.setCustomerCode(rs.getString("custcd")); 
         s.setYear(rs.getInt("year")); 
         s.setProduct(rs.getString("product")); 
         s.setPrice(rs.getDouble("price")); 
         s.setQty(rs.getInt("qty")); 
         hmpSalProd.get(rs.getString("product")).add(s); 
        } 
        if(!(hmpSalYear.containsKey(String.valueOf(rs.getInt("year"))))) 
        { 
         hmpSalYear.put(String.valueOf(rs.getInt("year")),hmpSalProd); 
        } 
        else 
        { 
         hmpSalYear.get(String.valueOf(rs.getInt("year"))). 
         get(rs.getString("product")).add(s); 
        } 

        if(!(hmpSalArea.containsKey(rs.getString("sacd")))) 
        { 
        hmpSales.put(rs.getString("sacd"),hmpSalYear); 
        } 
        else 
        { 
         hmpSales.get(rs.getString("sacd")). 
         get(String.valueOf(rs.getInt("year"))). 
         get(rs.getString("product")).add(s); 
        } 

      } 
      pst.close(); 
      rs.close(); 
    } 
    catch(SQLException se) 
    { 
      System.out.println("error loading: " + se.getMessage()); 
    } 
    return hmpSales; 

}   
+5

写一些代表你的数据的POJO而不是使用'HashMap >>>' – jlordo

+2

你可以发布异常堆栈跟踪吗? –

+1

你从哪里得到NPE? – Archer

回答

0

我建议定义2类:

  • 一个SalesKey类存储SalesAreaCode,年份和产品,覆盖equals和hashCode,非可变(没办法更改一次创建的值)
  • a SalesData类存储要映射到销售关键字(包括SalesAreaCode,年份和产品)的数据。

然后你就可以使用Map<SalesKey, SalesData>。这更容易理解,因此更容易实现你想要达到的目标。

相关问题