2016-05-05 15 views
0

オブジェクトを共有するHashMapsに問題があります。ネストされたHashMapはすべて同じ値を持ちます。どうすればこの問題を克服できますか? HashMapsを互いに独立させるためにはどうすれば作成できますか?HashMap共有オブジェクトの問題

これは私のDTOです。私の最初のIntegerオブジェクトは月を表す0-11の範囲です。文字列は国コード(すなわち「GB」)を表し、2番目の整数は人の総量を表します。その値を意味することになります。

public class ClientsByMonth { 
private HashMap<Integer, HashMap<String, Integer>> res2015 = new HashMap<>(); 

ここでは、HashMapsを作成しようとしています。特定の月には値がないので、値を追加する前に0をすべて最初に置いていますが、0にする必要があります。明らかに以下は機能しません。 DTOは を存在する場所

public class CBMSetter {  
HashMap<Integer, HashMap<String, Integer>> resHashMap = new HashMap<>();    


HashMap<String, Integer>[] byCountry = new HashMap[12]; 

String[] countrys = {"GB ", "PT ", "ES ", "BE ", "IE ", "FR ", "DE ", "CH ", "IR ", "NL ", " ", "Others"}; 
    for(int i = 0; i < 12; i++){ 
     byCountry[i] = new HashMap<>(); 
     for(int k = 0; k < 12; k++){ 
      byCountry[i].put(countrys[k], 0); 
     } 
    } 

    for(int i = 0; i < 12; i++){ 
    *** resHashMap.put(i, new HashMap(byCountry[i])); 
    } 
    for(int i = 0; i < 12; i++){ 
     **clientsBM.get(i).preSetRes(new HashMap(resHashMap)); 
    } 

**です***私はあなたのコードを介して行っている

+1

byCountry[0]を置き換えることによって、試すのですか?それを地図の価値にしましょうか?ネストされたハッシュマップは、この単純なもののためのリソースの無駄のようです。 –

+2

resHashMap.put(i、新しいHashMap(byCountry [0])); byCountry [0]がハードコーディングされています。これは問題ありませんか? – Awadesh

+1

私の前のポイントに加えて、外側のハッシュマップは必要ありません。あなたのキーはインデックスなので、Arraylistを使うべきです –

答えて

1

を編集し、すべてのネストされたハッシュマップは同じ値を持っています。このループではbyCountry[0]resHashMapに入れているためです。

for(int i = 0; i < 12; i++){ 
    resHashMap.put(i, new HashMap(byCountry[0])); 
} 

だから、解決策は、数値と文字列を保持するためのJavaクラスを作成しないのはなぜbyCountry[i]

+0

私はbyCountryを別の場所で使用しています。わかりやすくするためにここには示していません。各byCountry(0〜11)はすでに使用されています。私はbyCountryのようなハッシュマップの別の配列を作成する必要がありますか?より良い方法はありませんか? – SpiritCode

+1

あなたはPOJOを使うべきです、より良いオプションです、またはあなたがbyCountry [0]を使用しているところで更新されたデータを取り出すことができます) – Awadesh

+0

@ Awadash&@ cricket_007:このPOJOオブジェクトを作成しようとしています。その国の中のHashMapを作成し、その特定の月の値を保持します。それが最善の方法ですか? – SpiritCode

関連する問題