switch文で複数の変数を使用する方法はあるのか?

このQ&Aのポイント
  • Javaのswitch文に複数の変数を使用する方法を知りたいです。
  • switch文に変数を追加するための方法について教えてください。
  • 複数の変数をswitch文に組み込む方法を教えてください。
回答を見る
  • ベストアンサー

switch文について

下記のようなswitch文に もうひとつの変数 int tmp = Integer.valueOf(変数2).intValue();を代入したいのですが もう一つ代入できるのでしょうか?? 因みにswitch文にIF文を加えて変数を代入するのではなく switch文で複数の変数を使用したいのです。 どうぞよろしくお願いいたします。 なお、質問の意味が分からない、意図が伝わらない方は アドバイスはいりませんので 恐縮ですがアドバイスお願いいたします。 int lot = Integer.valueOf(変数1).intValue(); switch (lot) { case 1: out.print("OK"); break; case 2: out.print("NG"); break; default: out.print("エラー"); break;} }

  • Java
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

とは言われても > もうひとつの変数 > int tmp = Integer.valueOf(変数2).intValue();を代入 というのが、プログラミング用語として意味不明な使い方になっているので、意図が伝わる人の方が少ないと思いますが。 ※ 代入とは、「変数等に値を設定すること」です。 int tmp = Integer.valueOf(変数2).intValue(); は「変数tmpにInteger.valueOf(変数2).intValue()を代入」ですが、 「int tmp = Integer.valueOf(変数2).intValue();を代入」だと「どの変数に?何を?」となります。 switch (lot,tmp) { // もしかして、こういう風にすることを「代入」と呼んでいませんか?だとしたら、他人には伝わりません case 1,1: out.print("lot OK,tmp OK"); break; // lot==1,tmp==1のとき case 1,2: out.print("lot OK,tmp NG"); break; // lot==1,tmp==2のとき case 2,1: out.print("lot NG,tmp OK"); break; // lot==2,tmp==1のとき case 2,2: out.print("lot NG,tmp NG"); break; // lot==2,tmp==2のとき default: out.print("エラー"); break; } のように、2つの値で分岐したい、というのなら 「できません。あきらめて別の方法(if等)を使ってください」 が答えです。 どうしてもifがいやなら、switchの中にswithを書くことはできます switch (lot) { case 1: switch(tmp){ case 1: out.print("lot OK,tmp OK"); break; case 2: out.print("lot OK,tmp NG"); break; default: out.print("エラー"); break; } break; case 2: switch(tmp){ case 1: out.print("lot NG,tmp OK"); break; case 2: out.print("lot NG,tmp NG"); break; default: out.print("エラー"); break; } break; default: out.print("エラー"); break; } lot,tmpから、区別のつく一つの数値を求めれば、一つのswitchで分岐させることはできます。 switch (lot * 10 + tmp) { case 11: out.print("lot OK,tmp OK"); break; // lot==1,tmp==1のとき,lot*10+tmp=11 以下同様 case 12: out.print("lot OK,tmp NG"); break; case 21: out.print("lot NG,tmp OK"); break; case 22: out.print("lot NG,tmp NG"); break; default: out.print("エラー"); break;} } この例だと、lotやtmpに期待していない値が入っていると誤動作しますが。 # lot = 0 ; tmp = 11; と本来エラーになる値が入っていた場合 # lot*10+tmp=11で "lot OK,tmp OK"になる int lot_tmp=0; switch (lot) { case 1: lot_tmp += 10; break; case 2: lot_tmp += 20; break; } switch (tmp) { case 1: lot_tmp += 1; break; case 2: lot_tmp += 2; break; } switch (lot_tmp) { case 11: out.print("lot OK,tmp OK"); break; case 12: out.print("lot OK,tmp NG"); break; case 21: out.print("lot NG,tmp OK"); break; case 22: out.print("lot NG,tmp NG"); break; default: out.print("エラー"); break;} } これだと、先のような誤判定はなくなります。が。switchがいっぱいで読みにくいです 前半部の計算を int method1(int a,int b) { int ret=0; switch (a) { case 1: ret += 10; break; case 2: ret += 20; break; } switch (b) { case 1: ret += 1; break; case 2: ret += 2; break; } return ret } と、別のメソッドにすれば switch (method1(lot,tmp)) { // caseの10の位: lotの値 // caseの1の位: tmpの値 case 11: out.print("lot OK,tmp OK"); break; case 12: out.print("lot OK,tmp NG"); break; case 21: out.print("lot NG,tmp OK"); break; case 22: out.print("lot NG,tmp NG"); break; default: out.print("エラー"); break;} } これだと、あなたがやりたいことに近いかもしれません。 計算部分と、値を使うところが離れるので、あとでわかるようにコメントを入れておきましょう

ITJack
質問者

お礼

アドバイスありがとうございます。 違う言語のコードを提示しますと ケース文の中にケース分を書きたいのです。 ただし1つのケースは04と決まってます。 IF分はその他の条件で使用したいので・・・ 下記のような事をやりたいのです。 Select Case 設定1 Case "04"    ケース04は固定です。 Select Case 設定2 Case "11" If (CLng(金額1) <> 0 And (金額2) = 0 And CLng(金額3) = 0)) Then     tmp = "答え1" Case "12" If (CLng(金額1) <> 0 And (金額2) = 0 And CLng(金額3) = 0)) Then tmp = "答え2" あまり用語を知らずに細かく説明すると ご回答者様が把握しずらいのですが これをjavaでやろうとしていることが伝わりますでしょうか??

ITJack
質問者

補足

前半部の計算を int method1(int a,int b) { int ret=0; switch (a) { case 1: ret += 10; break; case 2: ret += 20; break; } switch (b) { case 1: ret += 1; break; case 2: ret += 2; break; } return ret } と、別のメソッドにすれば switch (method1(lot,tmp)) { // caseの10の位: lotの値 // caseの1の位: tmpの値 case 11: out.print("lot OK,tmp OK"); break; case 12: out.print("lot OK,tmp NG"); break; case 21: out.print("lot NG,tmp OK"); break; case 22: out.print("lot NG,tmp NG"); break; default: out.print("エラー"); break;} } これだと、あなたがやりたいことに近いかもしれません。 計算部分と、値を使うところが離れるので、あとでわかるようにコメントを入れておきましょう 上記のコメントいただいた方法を使用させていただきます。 分岐点が複雑なので助かりました。 どうもありがとうございました。

その他の回答 (2)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

ですから > どうしてもifがいやなら、switchの中にswithを書くことはできます > switch (lot) { > case 1: > switch(tmp){ > case 1: out.print("lot OK,tmp OK"); break; (以下略) って書いてますけど? そのVBのソースだって「二つの値で分岐」なんてしていません Select Case 設定1 Case "04"    ケース04は固定です。  ' 設定1が"04"の時の処理 ... という「設定1だけでのSelect Caseによる分岐」があって、 その中の「設置1が"04"の時の処理」が Select Case 設定2 Case "11" ... End Select と、「設定2だけでのSelect Caseによる分岐」になっています。 Javaでの「一つの値だけでのswitchによる分岐」とまったく同じ構造です。 # こういう構造になっているのは理解してますよね? Javaでもまったく同様に switch(設定1) { case 4: // 設定1が4のときの処理 break; // VBと同様にするには、breakが必要 } があって、「設定1が4のときの処理」として switch(設定2) { case 11: // 設定2が11のときの処理 break; ... } という構造にすればいいだけでは? これまでのバージョンでは、switchにはenumか整数しか使えなかったのですが、Java SE 7では、文字列も使えるようになったそうです。 case "04": など、VBと同様の書き方ができます。 > IF分はその他の条件で使用したいので・・ これが、意味も意図も不明です。 switchとifは、都合のいい方、ソース読んでわかりやすい方、やりたい条件分岐が可能な方を選べばいいだけです。 他で使いたいからといって、ここで使ってはいけない、ということは無いでしょう。

ITJack
質問者

お礼

毎回アドバイスどうもありがとうございます。 先ほどのお礼で私なにか質問しましたでしょうか?? これでやりたいことが伝わりますか?と報告しただけです。 最初の投稿で記述していただいた スイッチ分文の中にスイッチ文を書く方法(その他のソース含む) を教えていただいたので これから参考にしようと思ったのです。

ITJack
質問者

補足

if分はその他の条件で使用したいというのは、 スイッチの中でifを書くのに対して、自分自身が 分かりやすくする為だけに、 スイッチの中でスイッチを書いて 更にIfを書きたいと いったわがままなだけになります。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

この質問文からそのような意図を読み取るのは不可能... というか, 「それ以外の意図」でさえ読み取るのはほぼ不可能. 「あまり用語を知らずに細かく説明するとご回答者様が把握しづ (×ず) らい」と書いてるけど, この (そしてこれまでのあなたの) 質問文がまさにそう. 「用語を理解せず書いているためほかの人が解釈できない」文章になっていることは自覚してほしい. でその意図ならそれと同じことをやればいい. それだけ.

ITJack
質問者

お礼

追加になってしまいますが 他の人が解釈できない事は自覚してほしいと書いてあって その意図ならそれと同じことをやればいいだけとありますが アドバイスには受け取れません。 第一、その意図ならと発言した時点で、 投稿した質問は少なくとも分かっているはず。 ただそれをやればいいというのであれば いうまでもなくこちらから投稿はしてないはず。

ITJack
質問者

補足

ご指摘どうもありがとうございます。 用語の認識不足については恐縮です。 ただ私が理解できないことは 質問の意味が全く分からないのに 質問をしてくることです。 もし本当に言っている意味が全く分からなければ なにも出来ないはず。 分かりやすく言うとまったく分からない 外来語で話しかけられても何もできないことと一緒です。 つまりなんとなく憶測や、こうしたいんだろうなみたいなことが 伝わってないと会話も出来ないはずです。

関連するQ&A

  • switch文について

    独学でjavaの勉強をしているのですが、switch文が本のとおりに入力しても エラーがでて困っています。どこが間違っているのかわかりません。 ちなみにプログラム内容は class bunki2{ public static void main(String args[]){ int a; a=1; switch (a) { case1:System.out.println("変数aの値は1です。"); break; case2:System.out.println("変数aの値は2です。"); break; case3:System.out.println("変数aの値は3です。"); break; } } } です。 これでコンパイルしようとすると’case’、’default’、または’}’がありません。とでます。 なぜできないのか教えてください。

    • ベストアンサー
    • Java
  • switch文caseについて

    switchのcaseについてですが、数字を直接記述せずに、const変数に値を代入して使用出来ますか? 例) const int A = 1; const int B = 2; switch(suuti){ case A: 処理; break; case B: 処理; break; } コンパイルすると、「case 式は、整数型定数でなければなりません。」と出てきてしまうのですが、直接数値を記述しないといけないのでしょうか? よろしくお願いします。

  • switch で疑問。java超初心者です。

    まず、 public class P1{   public static void main(String[] args){     int n = 1;       switch(n){         case 0:           System.out.println("あ");           break;         case 1:           System.out.println("い");           break;         case 2:           System.out.println("う");           break;         default:           System.out.println("え");       }   } } は、当然「い」と表示されますよね。 default: をcase 3:にしても、問題なく「い」と表示されました。 そこで、こんな風にしてみました。 public class P3{   public static void main(String[] args){     int n = 1;     String s;       switch(n){         case 0:           s="あ";           break;         case 1:           s="い";           break;         case 2:           s="う";           break;         default:           s="え";       }       System.out.println(s);   } } これは「い」と表示されましたが、 default: をcase 3:にすると、エラーとなってしまいます。なぜでしょう。 ちなみに、エラーの内容は 変数 s は初期化されていない可能性があります。     System.out.print(s);                ^ というものでした。 そこで、 変数 s を初期化してみようと、次のように変数 s の宣言の後に null を代入しました。 String s=null; すると、「い」と表示され、エラーは出ません。 なぜ、このようになるのでしょうか。 String型の変数を使っていて、今まではこのようなエラーは出た事が無かったのですが、 どうやらswitch文の中では、初期化しろ、と出てくるようです。 わかり易い解説をいただければと思います。 これは仕様だということで、この通り受け入れるしかないのでしょうか。 勉強していて、少々腑に落ちないので、質問致しました。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • switchの中にIF分の条件分岐について

    int lot2 = Integer.valueOf(年金コード).intValue(); switch (lot2) { case 1: if( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0) && 旧共済退職年金減額該当表示.compareTo("0")==0 ){ out.print("退職  ");break;} case 2: if( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0)){ out.print ("通算退職");break;} 上記のコードは 年金コードが1の場合 制度コード8なおかつ9または旧共済退職年金減額該当表示が0のとき"退職  "を表示 年金コードが2の場合 制度コード8なおかつ9のとき"通算退職"を表示するコードになります。 このコードの条件に下記のコード } else if ( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0)&& 旧共済退職年金減額該当表示.compareTo("1")==0 ){ out.print ("減額退職"); 年金コードが1の場合 制度コード8なおかつ9または旧共済退職年金減額該当表示が1のとき"減額退職"を表示 とcase 1の中で 旧共済退職年金減額該当表示が1と0で条件判定したいのですが スイッチ文の中のcase 1を複数使用したい場合 どのようにすれば良いのでしょうか? どうぞよろしくお願いします。

    • ベストアンサー
    • Java
  • switch文で文字を比較することは出来ませんか?

    switch文で文字を比較することは出来ませんか? 例えば… int main(void){ char buf[5]; buf = 'b'; switch(buf){ case 'a': ・  ・  ・  break; case 'b': ・  ・  ・  break; }

  • 続・ZZZ,ZZZ,ZZ9形式の金額形式変換の件

    前投稿で解決した件で追加でのご質問ですが 例 9桁の数値文字列→カンマと*を含んだ11桁の文字列 000000000     → **********0 000000999    → ********999 123456789    → 123,456,789 と実行結果を求めたいときに下記ソースで解決しました。 int value = Integer.valueOf(九桁金額1).intValue(); NumberFormat nf = new DecimalFormat("###,###,##0"); String formatted = nf.format(value); //***,***,***形式Ver System.out.print("***,***,*** ".substring(formatted.length()) + formatted +"|"); } こちらに int value = Integer.valueOf(九桁金額2).intValue(); と別の金額項目を加えたいときに IF分で何々の時は九桁金額1 何々の時は九桁金額2と条件判定した場合 System.out.printの結果は int value = Integer.valueOf(九桁金額1).intValue();で int型から読み込んだ文字列は DecimalFormatの値に依存しているため 条件が増えるたびに System.out.print結果を変更しなければなりません。 九桁金額1と九桁金額2のSystem.out.print結果を その都度変更せずに 判定させる方法はありますでしょうか? どうぞよろしくお願いいたします。

    • ベストアンサー
    • Java
  • C++ Switch文について

    int main(){ char Data1 = 'b'; char Data2 = 'b'; int IntData = 0; switch (Data2) { case Data1: IntData = 2; break; case'b':  IntData = 3; break; } } と書くとコンパイルエラーで「整数型定数でなければいけません」と言われます。 case Data1: IntData = 2; break;をコメントアウトすると正常に動作します。 char Data1 = 'b';と、直書きの'b'の違いは何でしょうか。

  • switch分が機能しません。

    お世話になります。 下記のswitchのソースで文字列の値を 判定したいのですが String lot = 収録状況表示; switch (lot) { case "1": out.print("収録!"); break; case "2": out.print("未収録!"); break; default: out.print(" "); break; eclipseで機能しないPCがあります。 考えられる原因はなにかありますでしょうか?? 因みに きのうしないPCは switch (lot) {の箇所に Cannot switch on a value of type String for source level below 1.7. 変換可能な int 値または enum 定数のみが許可されています と表示されます。 機能しているPC  java -version "1.7.0_02 Java(TM) SE Runtime Environment (build 1.7.0_02-b13) Java HotSpot(TM) Client VM (build 22.0-b10, mixed mode, sharing) 機能していないPC    java version "1.7.0_03" Java(TM) SE Runtime Environment (build 1.7.0_03-b05) Java HotSpot(TM) Client VM (build 22.1-b02, mixed mode, sharing) 以上よろしくお願い致します。

    • ベストアンサー
    • Java
  • switch文をif文に変換

    以下のプログラムをif文に書き換えるとどうなるでしょうか? if文と論理演算子を使って短く書きかえられるらしいのですが。 #include <stdio.h> main() { int no; scanf("%d",&no); switch (no){ case 1: puts("1番です。\n"); break; case 2: puts("2番です。\n"); break; case 3: puts("3番です。\n"); break; case 4: puts("4番です。\n"); break; case 5: puts("5番です。\n"); break; case 6: puts("6番です。\n"); break; default: puts("そんな学年はありません。"); break; } }

  • switch文 defaultについて

    switch文で曜日を表示するプログラムを作成したいのですが、 任意の月の1日を日曜日とし、入力された日にち(変数date)の曜日を変数dayとしました。 day=(date-1)%7 とし、day=0のとき日曜日、day=1のとき月曜日、・・・、day=6のとき土曜日とします。 dateに0以下の数が入力されたとき、default文で「その月は1日から始まります。」 dateに32以上の数が入力されたとき、default文で「その月は31日までです。」 といったエラーを表示させたいと思います。 1つのswitch文の中に2種類のdefault文をどうやって書いたらいいのかわかりません。 switch文以下のプログラムは、以下のように書いてみました。 day=(date-1)%7; switch(day) { case 0: printf("1月%d日は日曜日です。",date); break; case 1: printf("1月%d日は月曜日です。",date); break; case 2: printf("1月%d日は火曜日です。",date); break; (case 3~case 5も同様に書く。) case 6: printf("1月%d日は土曜日です。",date); break; default: printf("1月は31日までです。"); /*dateに32以上の数が入力された場合のエラー表示*/ break; default: printf("1月は1日から始まります。"); /*dateに0以下の数が入力された場合のエラー表示*/ break; } しかし、1つのswitch文にdefault文は1つしか書けませんよね? 入力された日によってdefault文を使い分けるにはどうしたらよいのでしょうか。

専門家に質問してみよう