【问题标题】:Calculator without if/else or switch没有 if/else 或 switch 的计算器
【发布时间】:2011-05-08 07:18:12
【问题描述】:

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

有没有办法实现?

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.+

有什么线索吗?

【问题讨论】:

  • 有很多方法可以实现这一点。请提出具体问题,我们很乐意为您提供帮助。
  • 我会使用内置的 Javascript 解释器。
  • 在没有 if/else 和 case/switch 的情况下,Java 仍然是完整的,但是你为什么要这样限制自己呢?

标签: java calculator


【解决方案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 这个视频包含一个非常好的例子来说明这个操作:youtube.com/watch?v=4F72VULWFvc
  • 当然,从技术上讲,这只是隐藏条件,它们在 b-tree 搜索中。
  • @Software Monkey 但你不能指望在没有任何条件的情况下做到这一点。
【解决方案2】:

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

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

【讨论】:

  • 我喜欢这个答案 - 但不幸的是,OP 确实限制为“无开关”。
  • 在 Java 7 中,您可以跳过枚举并直接使用 case "+"
  • weeeeell 理论上,switch 是一个程序计数器跳转映射,而不是一个条件;P 这也是,为什么像 case "+" 这样的东西很难看,因为编译器(我认为)需要退化切换到一系列 if(equal)elseif(equal)elseif(equal) 而不是只执行“jmp 4*inputvalue”(可以这么说)
【解决方案3】:

散列呢?将运算符散列为键值对(“+”:+)。对于字符串操作符,对其进行散列并获取值。尝试一下

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 而且 lisp 也很棒,或者 python... 但这不是重点。否则,这不会被标记为 java。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 2016-11-30
    • 1970-01-01
    相关资源
    最近更新 更多