11

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

6 に答える 6

8

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

    switch (s1)  {
        case "a":  doAC(); break;
        case "b":  doBD(); break;
        default:
            switch(s2) {
                case "c":  doAC(); break;
                case "d":  doBD(); break;
            }
   }        
于 2013-03-05T12:11:16.850 に答える
5

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 番目のマップを作成してそれらを取得できます。

スイッチを使用したかったので、可能な候補と値が開発時に既知の固定されたリストであることを意味するため、このような静的に初期化されたマップを使用することは問題になりません。

于 2013-03-05T13:57:48.320 に答える
4

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

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

于 2013-03-05T12:16:31.070 に答える
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';

アップデート

コメントでは、次のように書きました。

スイッチに入る前に 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';

トリックを実行し、テストして、機能するかどうかを知らせてください

于 2013-03-05T12:02:35.227 に答える