###前提・実現したいこと
マスタとなるExcelを読み取って生成した二つのListを1行ずつ比較して、要素に違いがあれば行単位で抽出したいです。
上期マスタ:empPostList
下期マスタ:empLastPostList です。
抽出パターンは以下の通りです。
①上期マスタにあって下期マスタにない行(追加分)
②下期マスタにあって上期マスタにない行(削除分)
③変更のない行
###発生している問題・エラーメッセージ
思いつく方法で比較をしてみましたが、
全行変更なしとして抽出されてしまいます。
※1/26追記
Excelから生成したListに問題があったようで、現在試すと
仰る通りほとんど「削除」に入っていく状態です。
「削除」部分のelse ifを削ると「変更なし」と「変更あり」については期待通りの動作をしています。
「削除」(下期マスタにあって上期マスタにない行)の抽出方法を模索しているところです。
elseで対応してみたりしましたが、どうにもうまくいかない状況です。。
###該当のソースコード
Java
1 //「変更なし」格納用List 2 ArrayList<EmpPostBean> noChange = new ArrayList<EmpPostBean>(); 3 // 「変更あり」格納用List 4 ArrayList<EmpPostBean> Change = new ArrayList<EmpPostBean>(); 5 // 「削除用」格納用List 6 ArrayList<EmpPostBean> Del = new ArrayList<EmpPostBean>(); 7 8 9 10 // 上期マスタ 11 for (EmpPostBean This : empPostList) { 12 // 下期マスタ 13 for (EmpPostBean Last : empLastPostList) { 14 // 年、期、従業員ID、役職コードがすべて一致する場合 15 if (This.getYear().equals(Last.getYear())&&This.getTerm().equals(Last.getTerm())&&This.getDscId().equals(Last.getDscId())&&This.getPostCode().equals(Last.getPostCode())) { 16 noChange.add(This); 17 System.out.println("変更なしの行数:" + noChange.size()); 18 19 break; 20 21 // 従業員IDが一致し、役職コードが不一致の場合 22 }else if(This.getDscId().equals(Last.getDscId())&& !This.getPostCode().equals(Last.getPostCode())){ 23 Change.add(This); 24 System.out.println("変更ありの行数:" + Change.size()); 25 26 break; 27 28 // 従業員IDが一致しないが、役職コードがNULLでない場合 29 }else if(!This.getDscId().equals(Last.getDscId())&& This.getPostCode().isEmpty()|| Last.getPostCode().isEmpty()){ 30 Del.add(This); 31 System.out.println("削除の行数:" + Change.size()); 32 33 break; 34 } 35 } 36 } 37
※1/26追記
HashMapを使う方法を試行してみました。
今度は削除分はうまく動作しましたが、「変更なし」分が取れていないみたいです。
キーが一致したifに入った場合、更にif文でValue値のチェックを行っており、そこでcontainsValueがtrueになればキーもValue値も一致することになるので、「変更なし」に追加すると記述したつもりです。
ご指摘あればよろしくお願いします。
Java
1 // 今期マスタをHashMapに詰める 2 Map<String, EmpPostBean> Thismap = new HashMap<String, EmpPostBean>(); 3 for (EmpPostBean This : empPostList) { 4 5 // キーと値をセット 6 Thismap.put(This.getDscId(),This); 7 } 8 9 // 前期従業員マスタの要素がHashMapに含まれていれば変更なしリストに追加する 10 for (EmpPostBean This : empLastPostList) { 11 12 // キーが一致 13 if(Thismap.containsKey(This.getDscId())) { 14 // 役職コードが一致 15 if(Thismap.containsValue(This.getPostCode())){ 16 //変更なしリストに追加 17 noChange.add(This); 18 System.out.println("変更なしの行数:" + noChange.size()); 19 20 // 役職コードが不一致 21 }else{ 22 // 変更ありリストに追加 23 Change.add(This); 24 System.out.println("変更ありの行数:" + Change.size()); 25 } 26 }else{ 27 28 Del.add(This); 29 System.out.println("削除の行数:" + Del.size()); 30 } 31 }
###試したこと
・比較を行う際、equalsでなく「==」で試してみる
・HashMapを使って比較してみる
→キー指定が分からず断念しています。

回答4件
あなたの回答
tips
プレビュー