Оператор переключения Java для обработки двух переменных?

Я ищу способ обработки двух строк с помощью одного коммутатора, я думаю, что это невозможно в 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;
    }

Ответ 1

Использование одного переключателя в соответствии с вашим требованием невозможно. Это так близко, как вы собираетесь использовать Java.

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

Ответ 2

Единственный способ сделать это с помощью одного коммутатора - сначала слить два значения, найти тот, который имеет наивысший приоритет, и применить переключатель к результату. В вашем примере минимум s1 и s2 и включение результата.

Так как "a" через "g" являются примером, вам нужно иметь некоторый осмысленный способ ранжирования реальных значений.

Ответ 3

Считаете ли вы, что вы не используете оператор 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, вы можете построить вторую карту, чтобы вытащить ее из.

Поскольку вы хотели использовать переключатель , я считаю, что возможные кандидаты и значения являются фиксированными, известными во временном списке разработки, поэтому использование статически инициализированной карты, такой как это, не должно быть проблема.

Ответ 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';

Он должен сделать трюк, проверить его и сообщить мне, если он работает