2016-04-12 7 views
-2

Data.ListGroupedProductsforループを使用してHashMapを反復しようとするとnullが返されますか?ここで

public static HashMap<String, HashMap<String, WrapperProduct>> ListGroupedProducts = new HashMap<>(); 

の宣言でこれを行うための私の理由は、新規/更新されたオブジェクトとの深い、コレクション内のオブジェクトを交換することです。私はnullを取得して、getにHashMap内で必要なコレクションを作成しようとしています。ここで

enter image description here

私のデバッグのスクリーンショット、Data.ListGroupedProductsの上にマウスです。 enter image description here

赤い矢印は、私が到達しようとしていることです... forループでこれを繰り返すことはできませんか? Boannの答えに

UPDATE

おかげで、私は問題を解決することができました。 KeySetを反復するためにfor-loopを使用しようと試みたのと同じ間違いで誰かが落ちた場合の完全なメソッドです。あなたはHashMapを反復するループのfor (int x = 0; x < size; x++)スタイルを使用することはできません

//Product coming in, has the latest updates and this will be used 
    //to update the product deep in Data.ListGroupedProducts. 
    public boolean UpdateListGroupProducts(ManifestProduct product) { 

     for(int a=0; a < Data.SelectedInvoice.size(); a++){ 
      String invoiceNumber = Data.SelectedInvoice.get(a).ID; 

      if(Data.ListGroupedProducts.containsKey(invoiceNumber)){ 
       //Iterate over each key using a keyset, we will then use the key on the for-loop 
       //to retrieve the inner object and manipulate it as needed. 
       for(String key: Data.ListGroupedProducts.get(invoiceNumber).keySet()){ 
        for(int x=0; x < Data.ListGroupedProducts.get(invoiceNumber).get(key).ProductList.size(); x++){ 
         String productID = Data.ListGroupedProducts.get(invoiceNumber).get(key).ProductList.get(x).ID; 
         String productItemID = Data.ListGroupedProducts.get(invoiceNumber).get(key).ProductList.get(x).ITEMID; 

         if(product.ID.equals(productID) && product.ITEMID.equals(productItemID)){ 
          //Use ArrayList's set method to replace a position in the array with a new instance. 
          Data.ListGroupedProducts.get(invoiceNumber).get(key).ProductList.set(x, product); 
          return true; 
         } 
        }//Inner For 
       }//Outer For 
      } 
     } 
     return false; 
    } 
+2

これを[MCVE]に減らすことはできますか? Javaの命名規則に従ってください。 'Data.ListGroupedProducts.get(invoiceNumber)'の値を再利用しようとするならば、それをショートネーム変数に抽出し、それを再利用してください。はるかに読みやすいコードを作成します。 – Savior

+0

'a <= Data.SelectedInvoice.size() - 1'は、通常、' a

+2

これはあまり意味がありません。 'Data.SelectedInvoice.get(a).ID'で' containsKey'を呼び出し、 'Data.SelectedInvoice.get(a).ID.toString()'で 'get'を呼び出します。彼らは同じではありませんか? –

答えて

2

。マップ内のキーと値のペアには、関連する数値インデックスまたは特定の順序はありません。したがって、マップ上のget(x)を呼び出すと、キー0の値をルックアップしようとします。しかし、そのマップのキータイプはStringであり、実際のキーは"FREEZER"であるため、そのようなマッピングはありません。キー0とのマッピングがないため、getnullを返します。

for(int x...)ループを置き換え、内部HashMapの値ですWrapperProductインスタンスを反復する:

for (WrapperProduct w : Data.ListGroupedProducts.get(invoiceNumber).values()) { 
    System.out.println(w); 
} 

This pageは反復マップの方法についての詳細を説明しています。

+0

私は自分の問題を認識しました。私は 'foreach'をうまく使うことができると知っていましたが、内側のHashMapの内側の' obj'を新しいバージョンの ' obj'。私は間違っていた、リンクした説明と説明のおかげで。 – Dayan

+1

マップ内のオブジェクトのプロパティを変更することができます。実際に別のオブジェクトのインスタンスに置き換える場合は、マップ内で 'put'呼び出しで使用するキーにループ内でアクセスできるように、キーと値のペアまたはキーでマップを反復する必要があります。 – Boann

+0

ありがとうございます、私はキーと値のペアを試してみて、その実装が現時点ではうまくいかない場合は、どうしたらうまくいくかを見ていきます。 – Dayan

関連する問題