Оператор переключения 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';
Он должен сделать трюк, проверить его и сообщить мне, если он работает