2013-03-05 12 views
8

私は単一のスイッチを使用して2つの文字列を処理する方法を探していますが、私はこれをJavaでは不可能と考えています。2つの変数を処理するJava switch文?

ここでは、スイッチでのみ実現したいと思うような疑似コードがあります。

int s1Value = 0; 
    int s2Value = 0; 
    String s1 = "a"; 
    String s2 = "g"; 
    switch (s1 || s2) { 
     case "a": s1value = 0; s2value = 0; break; 
     case "b": s1value = 1; s2value = 1; break; 
     case "c": s1value = 2; s2value = 2; break; 
     case "d": s1value = 3; s2value = 3; break; 
     case "e": s1value = 4; s2value = 4; break; 
     case "f": s1value = 5; s2value = 5; break; 
     case "g": s1value = 6; s2value = 6; break; 
    } 
+0

's1'と' s2'は 'String'ではありません! – Apurv

+0

私はあなたが[Switch syntax](http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html)を理解していないと思います。 – christopher

+0

間違った部分をコピーして貼り付けました:)編集しました。 .. – Ciphor

答えて

1
あなたは単にそれを書き込むことによって、スイッチを使用せずに、あなたがやりたいことができ

s1value = s1.charAt(0)-'a'; //returns 0 if s1value="a", 1 if s1value="b", etc. 

は、あなたが何をどのような私は完全に理解していない意味ですかれる

(s1 || s2) 

このようなことをやりたいですか?

int s1Value = 0; 
    int s2Value = 0; 

    String s1 = "g"; 
    String s2 = "a"; 

    char s1char = s1.charAt(0); 
    char s2char = s2.charAt(0); 
    int myChar = Math.max(s1char, s2char); 
    s1Value = s2Value = myChar - 'a'; 

UPDATEコメントで

、あなたが書いた:

S1 = "G" とs2 = "G" trueに評価されますスイッチ、そして唯一のケースに入る前に、 case "g"なので、s1Valueとs2Valueの両方が6になり、スイッチを終了します。だから、

は、私はあなたがそう、s1とs2は同じ値で初期化されていることを言っていると思う:これは、あなたが望む何をすべき

int s1Value = 0; 
    int s2Value = 0; 

    String s1 = "g"; 
    String s2 = "g"; 

    char s1char = s1.charAt(0); 
    s1Value = s2Value = s1char - 'a'; //s1Value = s2Value = 6 

UPDATE 2

がs1 = "a"かつs2 = "d"の場合 "s" = "c"、s2 = "b"の場合 "b"とみなされる。

これを試してみてください:

int s1Value = 0; 
    int s2Value = 0; 

    String s1 = "g"; 
    String s2 = "a"; 

    char s1char = s1.charAt(0); 
    char s2char = s2.charAt(0); 
    int myChar = Math.min(s1char, s2char); 
    s1Value = s2Value = myChar - 'a'; 

それは、トリックを行うことをテストし、それはあなたの条件が不可能であるごとに単一のスイッチを使用して

+0

文字列の場合は、s1またはs2のいずれかがtrueであるかどうかをチェックし、そうであればいくつかのステートメントを実行します。 – Ciphor

+0

s1とs2は真または偽であることはできません**は文字列でありブールではありません**ので、基本的に文字列が真か偽かをチェックすることはできません。あなたの文字列はいつ真実であるべきか、それはいつ偽であるべきか教えてください。 – BackSlash

+0

まあ、 "g"は私の擬似で(s1.equals( "g")|| s2.equals( "g"))と言っているようなものです。 – Ciphor

8

を動作するかどうか、私に知らせなければなりません。 これはあなたのJavaを使用するのと同じくらいです。

switch (s1) { 
     case "a": doAC(); break; 
     case "b": doBD(); break; 
     default: 
      switch(s2) { 
       case "c": doAC(); break; 
       case "d": doBD(); break; 
      } 
    }   
+0

これは私が避けようとしていたものです/ – Ciphor

+0

2つの別個のスイッチは、doAC()またはdoBD()が2回呼び出されるため、コードにバグが発生する可能性があります。指定したとおりにネストされたスイッチを使用する必要があります。 – Java42

+0

あなたが言うように、私はブール式をswitch文として使うことができる日を夢見る必要があります:) – Ciphor

4

単一のスイッチでそれを行う唯一の方法は、最も高い優先順位を有するもの、及び結果にスイッチを適用することを発見、最初の2つの値をマージすることです。あなたの例では、s1とs2の最小値と結果の切り替えを行います。

"a"から "g"は例であるため、実際の値を最初にランク付けする意味のある方法が必要です。

4

スイッチステートメントを使用せず、ルックアップテーブルを使用していると思われましたか?

public class MyClass { 
    private static final Map<String, Integer> valuesMap; 

    static { 
     Map<String,Integer> aMap = new HashMap<>(); 
     aMap.put("a", 0); 
     aMap.put("b", 1); 
       ..... rest ..... 
     valuesMap = Collections.unmodifiableMap(aMap); 
    } 

    public void foo() 
    { 
     int s1Value = 0; 
     int s2Value = 0; 

     String s1 = "a"; 
     String s2 = "g"; 
     if(valuesMap.containsKey(s1)) 
     { 
      s1Value = valuesMap.get(s1); 
      s2Value = s1Value; 
     } 
     else if(valuesMap.contansKey(s2)) 
     { 
      s1Value = valuesMap(s2); 
      s2Value = s1Value; 
     } 
    } 
} 

あなたは、あなたからそれらを引くための第2のマップを構築することができ s2Valueの値の異なるセットを必要とした場合。

スイッチを使用したかったので、考えられる候補と値は固定されていることを意味しています。このような静的に初期化されたマップを使用することは問題ではありません。

関連する問題