web-dev-qa-db-ja.com

Java 2つの変数を処理するためのswitchステートメント?

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

これは、スイッチだけで実現したい種類の疑似コードです。

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

要件ごとに1つのスイッチを使用することはできません。これは、Javaを使用するのと同じくらい近いです。

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

switchステートメントを使用せず、代わりにルックアップテーブルを使用することを検討しましたか?

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

s2Valueの異なる値のセットが必要な場合は、それらをプルする2番目のマップを作成できます。

switchを使用したかったので、可能な候補と値は固定されており、開発時のリストでわかっているので、このように静的に初期化されたマップを使用しても問題はありません。

4
Jere

1つのスイッチでこれを行う唯一の方法は、最初に2つの値をマージし、優先順位が最も高い値を見つけて、その結果にスイッチを適用することです。あなたの例では、s1とs2の最小値、そして結果をオンにします。

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

4

次のように書くだけで、スイッチを使用せずにやりたいことができます。

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と評価される唯一のケースはケース "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

これはあなたが望むことをするはずです

更新2

s1 = "a"およびs2 = "d"の場合、ケース "a"を考慮し、s1 = "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';

それはトリックを行い、それをテストし、それが機能するかどうか私に知らせなければなりません

1
BackSlash