EDIT:忘记了可能导致问题的一行代码(夜间睡眠有帮助;)
好吧,已经晚了,所以我可能错过了一些基本的东西,但这是我的问题:
我已经查询了我的数据库,得到了一个看起来像这样的数据集:
零售_商店_篮子_商品_价格_文本1 2 8.991 1 1.51 6 11.091 4 3.992 6 10.992 2 92 1 1.793 4 2.993 1 1.54 1 1.394 6 9.994 4 3.54 2 7.99
现在我有一个Store类,它包含一个List项目,每个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项的值而不是引用?
您的问题是,当HashMap
转换为ArrayList
以从方法返回时,它不会保留插入/迭代顺序。
您可以通过在使用Map
进行加法的同时构建要返回的ArrayList
来解决此问题。
另一种方法是使用LinkedHashMap,它确实保留了插入/迭代顺序。