编辑:忘记了可能导致问题的一行代码(夜间睡眠有帮助;)
好吧已经很晚了,所以我可能会遗漏一些基本的东西,但这是我的问题:
我查询了我的数据库,得到了一个如下所示的数据集:
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
现在我有一个包含List项目的Store类,每个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”));
我有一个项目的散列(没有价格),其中包含未从我需要使用的数据库中提取的其他项目信息,然后也添加价格。但它不是通过使用对象引用的值进行复制。如何将basketItem分配给GlobalHashOfItems项的值而不是引用?
答案 0 :(得分:0)
您的问题是,当HashMap
转换为ArrayList
以从您的方法返回时,ArrayList
不会保留插入/迭代顺序。
您可以通过构建Map
来使用{{1}}进行添加来解决此问题。
另一种方法是使用保留插入/迭代顺序的LinkedHashMap。