こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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;}

}

投稿日時 - 2013-03-06 22:29:50

QNo.7980111

すぐに回答ほしいです

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

とは言われても

> もうひとつの変数
> 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;}
}
これだと、あなたがやりたいことに近いかもしれません。
計算部分と、値を使うところが離れるので、あとでわかるようにコメントを入れておきましょう

投稿日時 - 2013-03-07 08:10:17

補足

前半部の計算を
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;}
}
これだと、あなたがやりたいことに近いかもしれません。
計算部分と、値を使うところが離れるので、あとでわかるようにコメントを入れておきましょう

上記のコメントいただいた方法を使用させていただきます。
分岐点が複雑なので助かりました。
どうもありがとうございました。

投稿日時 - 2013-03-07 21:19:07

お礼

アドバイスありがとうございます。
違う言語のコードを提示しますと
ケース文の中にケース分を書きたいのです。
ただし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でやろうとしていることが伝わりますでしょうか??

投稿日時 - 2013-03-07 12:50:51

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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は、都合のいい方、ソース読んでわかりやすい方、やりたい条件分岐が可能な方を選べばいいだけです。
他で使いたいからといって、ここで使ってはいけない、ということは無いでしょう。

投稿日時 - 2013-03-07 17:20:14

補足

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

投稿日時 - 2013-03-07 20:35:10

お礼

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

投稿日時 - 2013-03-07 20:02:16

ANo.2

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

でその意図ならそれと同じことをやればいい. それだけ.

投稿日時 - 2013-03-07 15:43:16

補足

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

投稿日時 - 2013-03-07 19:52:55

お礼

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

投稿日時 - 2013-03-07 22:02:45