Как конфертировать из Строковая операция 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);
Другие вопросы по тегам