- ベストアンサー
条件分岐が多いIF文の書き方について
- 条件分岐が多いIF文の書き方についてご質問があります。結果が得られない場合の問題点などを指摘していただきたいです。
- 条件が多い場合のIF文の書き方についてご質問があります。コードの例を用いて、条件分岐が正しく行われるかどうか検証する方法について教えてください。
- 条件分岐が多いIF文の書き方についてご相談させていただきたいです。30パターンほどの条件分岐を行いたい場合に、最適なIF文の書き方や注意点についてご教示ください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> 条件がかなり多くても対応できますでしょうか?? できます。 > それか大きなグループとしては3通りありますので > IF分をおおきつ3つに分け > その中に各条件を指定し対応するようなことは可能でしょうか?? できます。 > switchの中にIF分を書いたりすることは出来るのでしょうか?? できます。 プログラミングのコツは「楽する方法を考える。そのためにはどんな努力も惜しまない」です。 今のコードは「まじめ過ぎ」です。 > ・制度コード=”04”または”08”または”09”以外で > A種コードが01の場合 .... 「制度コード=”04”または”08”または”09”以外」が共通してますから if( (制度コード.compareTo(”04”)!=0) && (制度コード.compareTo(”08”)!=0) && (制度コード.compareTo(”09”)!=0) ){ if( A種コード.compareTo("01")) {~ } とまとめられます。 ※ 日本語にだまされないでください。 「または」ということで ||を使っていますが、意味を考えれば 「(”04”または”08”または”09”)ではない」 です。 (制度コード.compareTo(”04”)!=0) || (制度コード.compareTo(”08”)!=0) || (制度コード.compareTo(”09”)!=0) は 「(”04”でない)または(”08”でない)または(”09”でない)」 ⇒ 常に真です。(04→「08でない」ので真、04以外→「04でない」ので真、すなわち、全てで真) 「(”04”または”08”または”09”)ではない」のままに ! ((制度コード.compareTo(”04”)==0) || (制度コード.compareTo(”08”)==0) || (制度コード.compareTo(”09”)==0)) にするか、ドモルガンの法則を使って 「(”04”でない)かつ(”08”でない)かつ(”09”ではない)」にするか、です。 制度コードで分類できるなら if (制度コード.compareTo(”04”)==0) { // 04関連 } else if (制度コード.compareTo(”08”)==0) { // 08関連 } else if (制度コード.compareTo(”09”)==0)) { // 09関連 } else { //ここは「(”04”または”08”または”09”)ではない」 } とすれば、大分すっきりします。なにより ! ((制度コード.compareTo(”04”)==0) || (制度コード.compareTo(”08”)==0) || (制度コード.compareTo(”09”)==0)) みたいな長々しい条件を何度も書かずにすみます。 これができるかどうかは、条件を解析する必要があります。 その努力は惜しんではいけません。
その他の回答 (4)
- jjon-com
- ベストアンサー率61% (1599/2592)
> おっしゃる通りです。(回答ANo.3への補足) え? ANo.3は質問者の意図どおりだとおっしゃっているのですか? 質問者は次の日本語の意味をちゃんと理解していらっしゃいますか? -------- (a)「制度コードが"04"である(注:それ以外の変数は検査しない)」 または (b)「制度コードが"08"ではない(注:それ以外の変数は検査しない)」 または (c)「制度コードが"09"ではない,かつ,年金種類a種コードが"01"である」 -------- (a)の"04"は,条件(b)に包含されているからそもそも不要な判定です。 条件(b)に適合すれば条件(c)は不問だから,制度コード=="08"でないものは年金種類a種コードを検査することなくすべてprint("老齢")される。 最後に条件(c)で,制度コード=="08"かつ年金種類a種コード=="01"のものがprint("老齢")される。 再度確認します。 以上が質問者の意図した条件式であるなら,そうおっしゃっていただけますか? もしもそうでなかったのなら, 小学校の算数で×÷よりも+-を優先させたいときにカッコで囲うのと同様に, 優先させたい条件式を()で囲ってください。
補足
コードにミスがありました。 } else if (制度コード.compareTo ("04") == 0 || 制度コード .compareTo ("08") != 0 || 制度コード .compareTo ("09") != 0 && 年金種類a種コード.compareTo ("01") == 0 ){ は間違いで 正しくは下記になります。 } else if (制度コード.compareTo ("04") != 0 || 制度コード .compareTo ("08") != 0 || 制度コード .compareTo ("09") != 0 && 年金種類a種コード.compareTo ("01") == 0 ){ ・制度コード=”04”または”08”または”09”以外で A種コードが01の場合 "老齢△△△"を設定 失礼いたしました。
- jjon-com
- ベストアンサー率61% (1599/2592)
論理和(または,||)よりも 論理積(かつ,&&)の方が結合が強いですから, -------- //************** の直前にある以下のif文は, } else if (制度コード.compareTo ("04") == 0 && 年金種類b種コード .compareTo ("01") != 0 || 年金種類b種コード .compareTo ("02") != 0 ) { 次の意味になります。 「制度コードが"04"であり,かつ,年金種類b種コードが"01"ではない」 または「年金種類b種コードが"02"ではない(注:制度コードの値は検査しない)」 -------- //************** の直後にある以下のif文は, } else if (制度コード.compareTo ("04") == 0 || 制度コード .compareTo ("08") != 0 || 制度コード .compareTo ("09") != 0 && 年金種類a種コード.compareTo ("01") == 0 ){ 次の意味になります。 「制度コードが"04"である(注:それ以外の変数は検査しない)」 または「制度コードが"08"ではない(注:それ以外の変数は検査しない)」 または「制度コードが"09"ではない,かつ,年金種類a種コードが"01"である」 -------- 以上が質問者の意図した条件式であるなら,そうおっしゃっていただけますか? もしもそうでなかったのなら, 小学校の算数で×÷よりも+-を優先させたいときにカッコで囲うのと同様に, 優先させたい条件式を()で囲ってください。
補足
アドバイスありがとうございます。 言い忘れてましたがデータにはスペースは含まれてません。 >以上が質問者の意図した条件式であるなら,そうおっしゃっていただけますか? おっしゃる通りです。 //****************************************************** より下の条件文は下記のようにしたくてコードを書いてます。 ・制度コード=”04”または”08”または”09”以外で A種コードが01の場合 "老齢△△△"を設定 ・制度コード=”04”または”08”または”09”以外で A種コードが02の場合 "通算老齢△"を設定 ・制度コード=”04”または”08”または”09”以外で A種コードが03の場合 "障害△△△を設定というように 続いていきます。 switchの中にIF分を書いたりすることは出来るのでしょうか??
- kmee
- ベストアンサー率55% (1857/3366)
if~elseはいくらでも繋がりますが、それをやるのは、あまりに無謀です。 条件を整理して、規則を見付けたりまとめたりして、すっきりさせるのが、結局近道だと思いますよ。 すくなくとも、私はこんなif elseばかりのコードを仕様通り正しく書ける自信はありません。 例えば if (コード1.compareTo ("04") == 0 && コード2 .compareTo ("01") == 0 ) { out.print ("00001"); } else if (コード1.compareTo ("04") == 0 && コード3 .compareTo ("02") == 0 ) { out.print ("00005"); } ってありますけど、 outCode="10000"; if (コード1.compareTo ("04") == 0) { if( コード2 .compareTo ("01") == 0 ) { outCode="00001"; } else if ( コード3 .compareTo ("02") == 0 ) { outCode="00005"; } } out.print(outCode) と書けば ・コード1.compareTo("04")の条件は全てここに入るので、チェック抜け防止になる ・「それ以外」用のif/elseをわざわざ作る必要がない ・out.printが1つなので、出力前に"1000"にリセットすることができる と、大分楽になるのでは? それとか コードを表わす正規表現→出力コード のようなテーブルを用意して コード1+コード2+コード3+... と正規表現がマッチしたら、対応する出力コード のように判定させるとか コード1.compareTo ("04") == 0 && コード3 .compareTo ("02") == 0 → "^0401" とマッチ
補足
アイデアどうもありがとうございます。 outCode="10000"; のようにして 結果をout.println(outCode); ようにすれば 条件がかなり多くても対応できますでしょうか?? それか大きなグループとしては3通りありますので IF分をおおきつ3つに分け その中に各条件を指定し対応するようなことは可能でしょうか??
- jjon-com
- ベストアンサー率61% (1599/2592)
元のJavaソースコード中に「コード1」や「コード2(半角空白)」が登場するわけではないですよね。 一部分だけを提示してもコンパイルできないという状態でかまいませんから, 異常が起こるというそのJavaソースコードを加工なくそのままCopy&Pasteで提示していただく方がトラブルの特定は早いです。
お礼
if (制度コード.compareTo ("04") == 0 && 年金種類b種コード .compareTo ("01") == 0 ) { out.print ("基礎・厚生"); System.out.print ("基礎・厚生"); } else if (制度コード.compareTo ("04") == 0 && 年金種類b種コード .compareTo ("02") == 0 ) { out.print ("厚生 "); } else if (制度コード.compareTo ("04") == 0 && 年金種類b種コード .compareTo ("01") != 0 || 年金種類b種コード .compareTo ("02") != 0 ) { out.print ("基礎 "); //******************************************************************************************************************************************* } else if (制度コード.compareTo ("04") == 0 || 制度コード .compareTo ("08") != 0 || 制度コード .compareTo ("09") != 0 && 年金種類a種コード.compareTo ("01") == 0 ){ out.print ("老齢 "); System.out.print ("老齢 "); } else if (年金種類a種コード.compareTo ("02") == 0 &&制度コード.compareTo ("04") != 0 || 制度コード .compareTo ("08") != 0 || 制度コード .compareTo ("09") != 0 ){ out.print ("通算老齢 "); } else if (年金種類a種コード.compareTo ("03") == 0 && 制度コード.compareTo ("04") != 0 || 制度コード .compareTo ("08") != 0 || 制度コード .compareTo ("09") != 0 ){ out.print ("障害 "); } else if (年金種類a種コード.compareTo ("04") == 0 && 制度コード.compareTo ("04") != 0 || 制度コード .compareTo ("08") != 0 || 制度コード .compareTo ("09") != 0 ){ out.print ("遺族 "); } else if (年金種類a種コード.compareTo ("05") == 0 && 制度コード.compareTo ("04") != 0 || 制度コード .compareTo ("08") != 0 || 制度コード .compareTo ("09") != 0 ){ out.print ("寡婦 "); } else if (年金種類a種コード.compareTo ("06") == 0 && 制度コード.compareTo ("04") != 0 || 制度コード .compareTo ("08") != 0 || 制度コード .compareTo ("09") != 0 ){ out.print ("かん夫 "); } else if (年金種類a種コード.compareTo ("07") == 0 && 制度コード.compareTo ("04") != 0 || 制度コード .compareTo ("08") != 0 || 制度コード .compareTo ("09") != 0 ){ out.print ("遺児 "); } else if (年金種類a種コード.compareTo ("07") == 0 && 制度コード.compareTo ("04") != 0 || 制度コード .compareTo ("08") != 0 || 制度コード .compareTo ("09") != 0 ){ out.print ("遺児 "); } else if (年金種類a種コード.compareTo ("08") == 0 && 制度コード.compareTo ("04") != 0 || 制度コード .compareTo ("08") != 0 || 制度コード .compareTo ("09") != 0 ){ out.print ("特例老齢 "); } else if (年金種類a種コード.compareTo ("09") == 0 && 制度コード.compareTo ("04") != 0 || 制度コード .compareTo ("08") != 0 || 制度コード .compareTo ("09") != 0 ){ out.print ("通算遺族 "); } else if (年金種類a種コード.compareTo ("10") == 0 && 制度コード.compareTo ("04") != 0 || 制度コード .compareTo ("08") != 0 || 制度コード .compareTo ("09") != 0 ){ out.print ("特例遺族 "); } else if (年金種類a種コード.compareTo ("11") == 0 && 制度コード.compareTo ("04") != 0 || 制度コード .compareTo ("08") != 0 || 制度コード .compareTo ("09") != 0 ){ out.print ("養老 "); } else if (年金種類a種コード.compareTo ("12") == 0 && 制度コード.compareTo ("04") != 0 || 制度コード .compareTo ("08") != 0 || 制度コード .compareTo ("09") != 0 ){ out.print ("母子 "); } else if (年金種類a種コード.compareTo ("13") == 0 && 制度コード.compareTo ("04") != 0 || 制度コード .compareTo ("08") != 0 || 制度コード .compareTo ("09") != 0 ){ out.print ("準母子 "); } else if (年金種類a種コード.compareTo ("14") == 0 && 制度コード.compareTo ("04") != 0 || 制度コード .compareTo ("08") != 0 || 制度コード .compareTo ("09") != 0 ){ out.print ("障害基礎 "); } else if (年金種類a種コード.compareTo ("15") == 0 && 制度コード.compareTo ("04") != 0 || 制度コード .compareTo ("08") != 0 || 制度コード .compareTo ("09") != 0 ){ out.print ("遺族基礎 "); } else if (制度コード.compareTo ("03") == 0 && 年金形態表示.compareTo ("4") != 0){ out.print ("老齢 "); } else if (年金コード.substring(0,2).compareTo ("01") == 0 && 制度コード.compareTo ("08") == 0 || 制度コード.compareTo ("09") == 0 ) { out.print ("退職 "); } else if (年金コード.substring(0,2).compareTo ("02") == 0 && 制度コード.compareTo ("08") == 0 || 制度コード.compareTo ("09") == 0 ) { out.print ("通算退職"); } else if (年金コード.substring(0,2).compareTo ("03") == 0 && 制度コード.compareTo ("08") == 0 || 制度コード.compareTo ("09") == 0 ) { out.print ("障害 "); } else { out.print(" ");} }
補足
お礼のほうにコードを記載したのですが 書ききれないのですべて記載してないです。 因みに//*********************より したが反応しなく それ以外の条件は すべて out.print ("基礎 "); の結果になってます。
お礼
下記のコードで大きなグループを2つ合わせて 結果を得ることが出来ました。 これを応用してさらに仕様を増やして 検証していきたいと思います。 どうもありがとうございました。 int lot = Integer.valueOf(年金種類a種コード).intValue(); switch (lot) { case 1: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print("老齢 ");break;} case 2: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("通算老齢 ");break;} case 3: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("障害 ");break;} case 4: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("遺族 ");break;} case 5: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("寡婦 ");break;} case 6: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("かん夫 ");break;} case 7: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("遺児 ");break;} case 8: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("特例老齢 ");break;} case 9: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("通算遺族 ");break;} case 10: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("特例遺族 ");break;} case 11: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("養老 ");break;} case 12: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("母子 ");break;} case 13: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("準母子 ");break;} case 14: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("障害基礎 ");break;} case 15: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("遺族基礎 ");break;}} int lot2 = Integer.valueOf(年金コード.substring(0,2)).intValue(); switch (lot2) { case 01: if( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0) ){ out.print("退職 ");break;} case 2: if( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0) ){ out.print ("通算退職");break;} case 3: if( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0) ){ out.print ("障害 ");break;} case 4: if( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0) ){ out.print ("遺族 ");break;} case 9: if( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0) ){ out.print ("通算遺族");break;} case 11: if( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0) ){ out.print ("退職共済");;break;} case 13: if( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0) ){ out.print ("障害共済");break;} case 14: if( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0) ){ out.print ("遺族共済");break;} } }
補足
アドバイス参考になってます。 > switchの中にIF分を書いたりすることは出来るのでしょうか?? できます。 こちらから考えて作業を進めてます。 int lot = Integer.valueOf(年金種類a種コード).intValue(); switch (lot) { case 1: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print("老齢 ");break;} case 2: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("通算老齢 ");break;} case 3: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("障害 ");break;} case 4: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("遺族 ");break;} case 5: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("寡婦 ");break;} とswitchの中にIF分を書くことで私がチェックしやすいという理由で 作業しているのですが 大きなグループごとでは反応するようになりました。 これを下記のように別のグループを追加すると int lot2 = Integer.valueOf(年金コード.substring(0,2)).intValue(); switch (lot2) { case 01: if( (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print("退職 ");break;} case 02: if( (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("通算退職");break;} case 03: if( (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("障害 ");break;} case 04: if( (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("遺族 ");break;} case 9: if( (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("通算遺族");break;} 追加コードが反応しないのですが すべてのグループを反応させるにはどのような事に気をつければ よいのでしょうか?? 何か注意すべきことが分かればご教授頂きたいのですが・・・ よろしくお願いします。