前提・実現したいこと
Java初心者です。
二つのList<Map<String,Object>>型で作成したListの要素を比較し
異なる要素があるListのみ(下記ソースコードでいうと[1]のみ)を条件分岐させたいです。
ご教示いただければと思います。
発生している問題・エラーメッセージ
① 下記の書き方だと ListA[0]とListB[0] ListA[0]とListB[1] ListA[1]とListB[0] ListA[1]とListB[1] の比較をしているようです。 【やりたいこと】 ListA[0]とListB[0] ListA[1]とListB[1] のみ比較して、条件分岐させたいと考えています 格納が多くなるにつれて ListA[3]とListB[3] ListA[4]とListB[4] .... ② ListAをListBとしてコピーしたのですが、 ListAの要素を書き換えるとListBも更新されます。(意図しない実装になっています。) サイト等を見てディープコピーとしてコーディングしているのですが、なぜこうなるのかが分かりません。
該当のソースコード【OLD】
java
1List<Map<String,Object>> ListA new ArrayList<Map<String,Object>>(); 2 3Map<String,Object> mapA = new HashMap<String,Object>(); 4Map<String,Object> mapB = new HashMap<String,Object>(); 5 6// ListAに格納処理 7mapA.put ("性別", "男性"); 8mapA.put ("名前", "山田"); 9mapA.put ("年齢", "20"); 10ListA.add(mapA) 11 12mapB.put ("性別", "女性"); 13mapB.put ("名前", "田中"); 14mapB.put ("年齢", "25"); 15ListA.add(mapB) 16 17// ListBに格納処理(ListAの[1]の年齢だけ異なる) 18List<Map<String,Object>> ListB new ArrayList<Map<String,Object>>(); 19mapA.put ("性別", "男性"); 20mapA.put ("名前", "山田"); 21mapA.put ("年齢", "20"); 22ListB.add(mapA) 23 24mapB.put ("性別", "女性"); 25mapB.put ("名前", "田中"); 26mapB.put ("年齢", "50"); 27ListB.add(mapB) 28 29//Listを比較し、異なるものを条件分岐させる 30for(Map<String, Object> map : ListA) { 31 for(Map<String, Object> map2 : ListB) { 32 if(!(map.equals(map2))) { 33 34//DB更新処理 35 } 36 } 37 }
修正後のソースコード
java
1List<Map<String, Object>> ListA = new ArrayList<Map<String, Object>>(); 2 3Map<String, Object> mapA = new HashMap<String, Object>(); 4Map<String, Object> mapB = new HashMap<String, Object>(); 5 6// ListAに格納処理 7mapA.put("性別", "男性"); 8mapA.put("名前", "山田"); 9mapA.put("年齢", "20"); 10ListA.add(mapA); 11 12mapB.put("性別", "女性"); 13mapB.put("名前", "田中"); 14mapB.put("年齢", "25"); 15ListA.add(mapB); 16 17// リストAを複製 18List<Map<String, Object>> ListB = new ArrayList<Map<String, Object>>(ListA); 19 20//間違った実装によりコメントアウト 21//mapB.put("性別", "女性"); 22//mapB.put("名前", "田中"); 23mapB.put("年齢", "50"); 24//ListA.add(mapB); 25 26 27// ListAとListBを比較し、異なるものを条件分岐させる 28for (Map<String, Object> map1 : ListA) { 29 for (Map<String, Object> map2 : ListB) { 30 if (!(map1.equals(map2))) { 31 32 // DB更新処理 33 } 34 } 35}
試したこと
java
1Map<String, Object> mapCompare = new HashMap<String, Object>(); 2Map<String, Object> motoMap = new HashMap<String, Object>(); 3 4for (int j = 0; j < ListA.size(); j++) { 5 motoMap.putAll(ListA.get(j)); 6 for (int i = 0; i < ListB.size(); i++) { 7 mapCompare.putAll(ListB.get(i)); 8 if (!(motoMap.equals(mapCompare))) { 9 } 10 } 11}
補足情報(FW/ツールのバージョンなど)
回答1件
あなたの回答
tips
プレビュー