2012-01-07 62 views
0

编辑:忘了一行代码,很可能导致该问题的(一夜的睡眠帮助;)转换的ResultSet的DTO有意想不到的结果

确定它的晚,所以我可能失去了一些东西在这里根本,但这是我的问题:

我有我的查询DB和获得的数据集是这样的:

 
retail_store_id basket_item_id price_txt 
1   2  8.99 
1   1  1.5 
1   6  11.09 
1   4  3.99 
2   6  10.99 
2   2  9 
2   1  1.79 
3   4  2.99 
3   1  1.5 
4   1  1.39 
4   6  9.99 
4   4  3.5 
4   2  7.99

现在我有包含列表项的存储类和每个basketitem有价。

现在得到的是进入我的DTO的我这样做:

Map<Integer, Store> shoppedBasketHash = new HashMap<Integer, Store>(); 
    while (rs.next()){ 
      int storeID = rs.getInt("retail_store_id"); 

      basketItem = new BasketItem(); 
          basketItem = GlobalHashOfItems.get(rs.getInt("basket_item_id")); 
      basketItem.price = new BigDecimal(rs.getString("price_txt")); 

      if(shoppedBasketHash.containsKey(storeID)){ 
       shoppedBasketHash.get(storeID).items.add(basketItem);     
      }else{ 

       Store store = new Store(); 
       store.retailStoreID = rs.getInt("retail_store_id"); 

       store.items = new ArrayList<BasketItem>(); 
       store.items.add(basketItem); 

       shoppedBasketHash.put(storeID, sb); 
      } 
     } 
    return new ArrayList<Store>(shoppedBasketHash.values()); 

现在,出于某种原因,后来当我把这个名单上:

for(Store s: listOfStores){ 
     for(BasketItem b: s.items){ 
         System.out.println(b.price); 
        } 
     } 

我得到这个: 9.99

3.5

7.99

1.39

1.39

9.99

7.99

1.39

3.5

3.5

7.99

1.39

9.99

哪个不是价格我参加了同一列表。我在做什么错?

我现在意识到问题出在 basketItem = GlobalHashOfItems.get(rs.getInt(“basket_item_id”));

我有一个项目(不包括价格)的哈希值,其中包含不从,我需要用再加入价格太高的DB拉到其他项目信息。但它不是通过值使用对象引用进行复制。我如何让basketItem分配给GlobalHashOfItems项的值而不是引用?

回答

0

您的问题是HashMap在将其转换为ArrayList以从您的方法返回时不保留插入/迭代顺序。

您可以通过构建ArrayList同时使用Map的除了返回解决这个问题。

另一种方法是使用一个LinkedHashMap这确实保留插入/迭代顺序。

+0

谢谢,我认为我的return语句之前可能是一个问题,我从来没有使用的值()。 但是我试过这个: \t \t'List stores = new ArrayList (); \t \t设置 keys = shoppedBasketHash.keySet(); (Integer i:钥匙){ \t \t \t stores.add(shoppedBasketHash.get(i)); \t \t} \t \t \t \t回店;' \t \t 我仍然得到同样的结果 – 2012-01-07 23:51:01

+0

@PiersMacDonald,你可以尝试从同一问题的困扰;迭代(未排序)'Map'和'Set'按随机顺序排列。如果您的目标是重现resulset的序列,那么当您将商店放入地图时,请添加到'ArrayList'。如果你的目标是按键值对结果进行排序(就像你上面的尝试),你可以通过使用像TreeMap这样的有序地图来实现它。 (当然,store.items()的iteratino序列也是如此)。 – rsp 2012-01-08 09:58:00