Как конфертировать из Строковая операция a [sign] b без if.
Код вычисляет результат по выражению a [знак] b .Возможные операции: + - *. Могу ли я решить это упражнение, не используя условие if?
String result = "3 + 6 = ";
String result = outputStream.toString();
String[] resultArray = result.split(" ");
Integer first = Integer.parseInt(resultArray[0]);
Integer second = Integer.parseInt(resultArray[2]);
String opp = resultArray[1];
if("+".equals(opp)){
System.out.println(String.format("%d %s %d = %d", first, opp, second, first + second));
}
else if("-".equals(opp)){
System.out.println(String.format("%d %s %d = %d", first, opp, second, first - second));
}
else if("*".equals(opp)){
System.out.println(String.format("%d %s %d = %d", first, opp, second, first * second));
}
3 ответа
Альтернативой является использование распределительного шкафа:
switch (opp.charAt(0)) {
case '+':
System.out.println(String.format("%d %s %d = %d", first, opp,
second, first + second));
break;
case '-':
System.out.println(String.format("%d %s %d = %d", first, opp,
second, first - second));
break;
case '*':
System.out.println(String.format("%d %s %d = %d", first, opp,
second, first * second));
break;
}
Да, вы можете избежать этого состояния двумя способами - используя switch
и используя Map
:
С switch
заявление:
if (opp.length() != 1)
// Show error, and exit.
switch(opp.charAt(0)) {
case '+':
System.out.println(String.format("%d %s %d = %d", first, opp, second, first + second));
break;
case '-':
System.out.println(String.format("%d %s %d = %d", first, opp, second, first - second));
break;
case '*':
System.out.println(String.format("%d %s %d = %d", first, opp, second, first * second));
break;
default:
// Show error...
break;
}
С Map<K,V>
и специальный интерфейс:
interface Operation {
int calc(int a, int b);
}
Map<String,Operation> ops = new HashMap<String,Operation> {
{"+", new Op() {public calc(int a, int b) {return a+b;}}}
, {"-", new Op() {public calc(int a, int b) {return a-b;}}}
, {"*", new Op() {public calc(int a, int b) {return a*b;}}}
};
...
Operation op = ops.get(opp);
if (op == null)
// Report an error and exit
System.out.println(String.format("%d %s %d = %d", first, opp, second, op(first, second)));
Основываясь на некоторых других ответах (используя оператор switch или карту), я думаю, что самое чистое решение - переместить операторов в перечисление:
public enum Operator {
ADDITION("+") {
public int operate(int a, int b) {
return a + b;
}
},
SUBTRACTION("-") {
public int operate(int a, int b) {
return a - b;
}
},
MULTIPLICATION("*") {
public int operate(int a, int b) {
return a * b;
}
};
private String symbol;
private Operator(String symbol) {
this.symbol = symbol;
}
public abstract int operate(int a, int b);
public static Operator fromSymbol(String symbol) {
for (Operator o : values()) {
if (o.symbol.equals(symbol)) {
return operator;
}
}
throw new IllegalArgumentException("No operator with symbol " + symbol);
}
}
Тогда у вас есть очень простой API для получения правильного оператора из его символа (и наоборот), и очень легко добавить еще (например, деление). Он также имеет дополнительное преимущество, позволяя вам передавать экземпляры Operator
и обращаться к ним по имени напрямую (например, Operator.ADDITION
).
String symbol = "*";
Operator o = Operator.fromSymbol(symbol);
int a = 2;
int b = 3;
int result = o.operate(a, b);