2012-01-07 19 views
0

EDITがあります。そうな問題を引き起こしているコードの行(夜の睡眠は助け;)忘れてしまった、それは遅ので、私はおそらくここに根本的な何かが欠けていますが、これは私の問題ですは、予期しない結果に

[OK]を:

 
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

は、今私はリストの項目が含まれStoreクラスがあり、各basketitemが価格を持っています

私は自分のDBを照会し、このようになり、データセットを取得しています。

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()); 

何らかの理由で、後で私はこのリストを取るときに:私はこれを行うに私のDTOのにそれを得るために、今

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

私はこの取得: 9.99

3.5

.99

7.99

1.39

3.5

3.5

7.99

1.39

1.39

私が取った価格のリストと同じではありません

1.39

9.99

。私が間違って何をしているのですか?

私は今問題があることを理解しています basketItem = GlobalHashOfItems.get(rs.getInt( "basket_item_id"));

価格を使わないアイテムのハッシュを持っています。このアイテムには、DBから引き出されずに価格を追加する必要があるアイテム情報が含まれています。しかし、オブジェクト参照を使用して値をコピーしているわけではありません。 basketItemを参照ではなくGlobalHashOfItems項目の値に割り当てるようにするにはどうすればよいですか?

答えて

0

HashMapは、ArrayListに変換されてメソッドから戻るときに挿入/繰り返しの順序が保持されないという問題があります。

Mapを追加して返信する場合はArrayListを作成して解決できます。

もう1つの方法は、挿入/反復の順序を保持するLinkedHashMapを使用することです。

+0

ありがとうございました。私はreturn文が問題になるかもしれないと考えていました。以前はvalues()を使用したことがありませんでした。=新しいArrayListを() \t \t '一覧店舗;: は、しかし、私はこれを試してみました \t \tセット keys = shoppedBasketHash.keySet(); \t \t(整数i:キー){ \t \t \t stores.add(shoppedBasketHash.get(i)); \t \t} \t \t \t \tリターン店; ' \t \t 私はまだ –

+0

@PiersMacDonaldは、あなたの試みは、同じ問題に苦しんで同じ結果を得ています。反復(ソートされていない) 'Map'と' Set'はランダムな順序です。あなたの目標がresulsetのシーケンスを再現することであるならば、マップにストアを置くときに 'ArrayList'に追加してください。上記のようなキー値の結果をソートすることが目的ならば、TreeMapのような順序付けされたマップを使って結果を得ることができます。 (もちろん 'store.items()'のiteratinoシーケンスも同じです。) – rsp