没有if / else或switch的计算器

时间:2011-05-08 07:18:13

标签: java calculator

我正在尝试无条件地为+ - * /编写计算器。运算符存储为字符串。

无论如何要实现它吗?

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:No enum const class Main $ Operator。+

任何线索?

5 个答案:

答案 0 :(得分:11)

您可以使用策略模式并为每个运营商存储计算策略。

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)

我认为使用枚举将是一个不错的选择:

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;
}

答案 2 :(得分:0)

哈希怎么样?将运算符哈希作为键值对(“+”:+)。对于字符串操作,哈希它并获取值。试验

答案 3 :(得分:0)

如Peter Lawrey所述,ScriptEngine / JavaScript可能是一个不错的选择。访问这个小JavaScript interpreter applet来探索可能性。

答案 4 :(得分:-1)

如果不使用if / else和case / switch,Java仍然是完整的,但你为什么要这样做呢?