Калькулятор без if / else или переключателя

#java #calculator

#java #калькулятор

Вопрос:

Я пытаюсь написать калькулятор для - * / без условий. Оператор хранится в виде строки.

Есть ли способ достичь этого?

 public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        ////String Operator = "";
        String L1="";
        String L2="";
        String op = " ";
        double a = 3;
        double b = 2;

        //Operator p = p.
        Operator p;
        b = Operator.count(a, op, b);
        System.out.println(b);
    }

    public enum Operator {
        PLUS(" "), MINUS("-"), DIVIDE("/"), MULTIPLY("*");

        private final String operator;

        public static double count(double a,String op,double b) {
            double RetVal =0;
            switch (Operator.valueOf(op)) {
            case PLUS:
                RetVal= a   b;
            case MINUS:
                RetVal= a - b;
            case DIVIDE:
                RetVal= a / b;
            case MULTIPLY:
                RetVal= a * b;
            }
            return RetVal;
        }

        Operator(String operator) {
            this.operator = operator;

        }
        // uniwersalna stała grawitacyjna (m3 kg-1 s-2)
    }

}
  

Получил эту ошибку:

Исключение в потоке «main» java.lang.Исключение IllegalArgumentException: нет перечисления const класса Main$Operator.

Есть какие-нибудь подсказки?

Комментарии:

1. Есть много способов достичь этого. Пожалуйста, задавайте конкретные вопросы, и мы будем рады вам помочь.

2. Я бы использовал встроенный интерпретатор Javascript.

3. Java по-прежнему работает по тьюрингу без if / else и case / switch, но зачем вам так ограничивать себя?

Ответ №1:

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

 interface Calculation {
  double calculate(double op1, double op2);
}

class AddCalculation implements Calculation {
  double calculate(double op1, double op2) {
    return op1   op2;
  }
}

//others as well

Map<String, Calculation> m = ...;

m.put(" ", new AddCalculation());
  

Затем во время выполнения вы получаете объекты вычисления с карты и выполняете calculate() .

Комментарии:

1. 1 Это видео содержит очень хороший пример именно для этой операции: youtube.com/watch?v=4F72VULWFvc

2. Конечно, технически, это просто скрывает условия, которые находятся в поиске по b-дереву.

3. @Software Monkey но вы не можете ожидать, что это получится без каких -либо скрытых где-либо условий.

Ответ №2:

я думаю, что использование enum было бы хорошим вариантом:

 Enum Operation{
PLUS(" ")
MINUS("-")
DIVIDE("/")
MULTIPLY("*")
}
  

тогда вы могли бы использовать

 switch(Operation.valueOf(userInputString)){
case PLUS: return a b;
case MINUS: return a-b;
case DIVIDE: return a/b;
case MULTIPLY: return a*b;
}
  

Комментарии:

1. Мне нравится этот ответ — но, к сожалению, OP ограничился «no switch».

2. Затем в Java 7 вы можете пропустить перечисление и напрямую использовать case " " .

3. weeeeell теоретически, switch — это карта перехода счетчика программы, а не условие; P Это также объясняет, почему такие вещи, как case » «, довольно уродливы, потому что компилятору (я думаю) нужно вырождать switch в серию if (equal)elseif(equal)elseif(equal) вместо того, чтобы просто выполнять «jmp 4 * inputvalue» (так сказать)

Ответ №3:

как насчет хэширования? Хэшируйте операторы в виде пары ключ-значение (» «: ). Для строковой операции хэшируйте ее и извлекайте значение. Поэкспериментируйте с этим

Ответ №4:

Как упоминал Питер Лоури, ScriptEngine / JavaScript может быть хорошим выбором для этого. Посетите этот небольшой апплет-интерпретатор JavaScript, чтобы изучить возможности.

Комментарии:

1. И lisp тоже замечательный, или python… Но дело здесь не в этом. В противном случае это не было бы помечено как java.