dポイントプレゼントキャンペーン実施中!

テキスト入出力でのIF分についてご質問がございます。
例えば条件が多いときに、結果が得られない時があるのですが
書き方で何か問題があるのならご指摘ください。
下記のコードでご説明します。

//コード1の文字列が04でコード2の文字列が01の場合00001を表示

if (コード1.compareTo ("04") == 0 && コード2 .compareTo ("01") == 0 ) {

out.print ("00001");

//コード1の文字列が04でコード3の文字列が2の場合00005を表示


} else if (コード1.compareTo ("04") == 0 && コード3 .compareTo ("02") == 0 ) {

out.print ("00005");

//コード1の文字列が08でコード3の文字列が07の場合10000を表示


} else if (コード1.compareTo ("08") == 0 && コード3 .compareTo ("07") == 0 ) {

out.print ("10000");


//コード1の文字列が10でコード5の文字列が07の場合30000を表示

} else if (コード1.compareTo ("10") == 0 && コード5 .compareTo ("07") == 0 ) {

out.print ("30000");

//それ以外エラー

} else {
out.print("エラー");}

}

値がIF分の条件とマッチしていても


if (コード1.compareTo ("04") == 0 && コード2 .compareTo ("01") == 0 ) {

out.print ("00001");

//コード1の文字列が04でコード3の文字列が2の場合00005を表示


} else if (コード1.compareTo ("04") == 0 && コード3 .compareTo ("02") == 0 ) {

out.print ("00005");

//コード1の文字列が08でコード3の文字列が07の場合10000を表示


} else if (コード1.compareTo ("08") == 0 && コード3 .compareTo ("07") == 0 ) {

out.print ("10000");

このコードまでに当てはまらない条件はすべて
("10000");
の結果になり
つまりそれ以降のelse if の条件に
当てはまらなくなります。
else if をいくらでも増やして条件分岐出来ると学習して
検証しているのですが・・・
最終的にがIF~else if ~elseで
30パターンぐらい条件分岐したいと思ってます。
初歩的なご質問で恐縮ですが
アドバイス
よろしくお願いします。

A 回答 (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)) みたいな長々しい条件を何度も書かずにすみます。

これができるかどうかは、条件を解析する必要があります。
その努力は惜しんではいけません。

この回答への補足

アドバイス参考になってます。

> 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;}
追加コードが反応しないのですが
すべてのグループを反応させるにはどのような事に気をつければ
よいのでしょうか??


何か注意すべきことが分かればご教授頂きたいのですが・・・
よろしくお願いします。

補足日時:2012/09/02 10:29
    • good
    • 0
この回答へのお礼

下記のコードで大きなグループを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;}

}
}

お礼日時:2012/09/02 13:11

> おっしゃる通りです。

(回答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の場合
"老齢△△△"を設定

失礼いたしました。

補足日時:2012/09/01 21:49
    • good
    • 0

論理和(または,||)よりも 論理積(かつ,&&)の方が結合が強いですから,



--------
//************** の直前にある以下の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分を書いたりすることは出来るのでしょうか??

補足日時:2012/09/01 01:21
    • good
    • 0

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つに分け
その中に各条件を指定し対応するようなことは可能でしょうか??

補足日時:2012/09/01 01:27
    • good
    • 0

元のJavaソースコード中に「コード1」や「コード2(半角空白)」が登場するわけではないですよね。


一部分だけを提示してもコンパイルできないという状態でかまいませんから,
異常が起こるというそのJavaソースコードを加工なくそのままCopy&Pasteで提示していただく方がトラブルの特定は早いです。

この回答への補足

お礼のほうにコードを記載したのですが
書ききれないのですべて記載してないです。
因みに//*********************より
したが反応しなく
それ以外の条件は
すべて
out.print ("基礎   ");
の結果になってます。

補足日時:2012/08/31 22:13
    • good
    • 0
この回答へのお礼

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(" ");}

}

お礼日時:2012/08/31 22:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!