bjr*_*rnt 3 java optimization if-statement
我在做什么:
我正在用Java创建一个简单的计算器,它读取一个使用后缀表示法编写的字符串(例如:3 4 +).然后它接受字符串并从左到右开始读取它.它存储它找到的每个数字,然后应用以下运算符.例如:3 4 + - >存储3,存储4,运行3 + 4并存储结果.
我需要帮助的是:
应该以什么方式检查字符与预定义的运算符(if(c =='/')等).在我的情况下,对于if-else树有哪些替代方案,如果我希望能够以最小的努力添加新的运算符(以及最低的性能损失),我应该选择哪一个.什么通常被认为是良好的做法?
如果这是一个供人类使用的计算器,请停止考虑性能(如执行速度).没有人能够注意到if-tree和任何其他实现之间的区别.
也就是说,您可能希望尝试实现某种类型的Operator类,它知道如何将自身应用于参数,然后使用运算符名称中的哈希值(字符串如"+"," - ","*"等等) )到适当的实例.
我不担心性能,因为计算机可以解析/计算数据的速度比键入公式快100万倍(这不是夸大)
我接近它的方法是使用if/else或使用switch语句
switch(ch) {
case '+':
break;
case '-':
break;
// etc.
}
Run Code Online (Sandbox Code Playgroud)
如果将操作封装为对象,则通常可以使用数据结构替换类似switch语句,并希望将来只添加操作.
例如,这是将操作封装为对象的一种方法:使用Enum来表示操作:
http://download.oracle.com/javase/1.5.0/docs/guide/language/enums.html
public enum Operation {
PLUS { double eval(double x, double y) { return x + y; } },
MINUS { double eval(double x, double y) { return x - y; } },
TIMES { double eval(double x, double y) { return x * y; } },
DIVIDE { double eval(double x, double y) { return x / y; } };
// Do arithmetic op represented by this constant
abstract double eval(double x, double y);
}
Run Code Online (Sandbox Code Playgroud)
您可以扩展此示例以将符号与每个操作相关联,并提供静态方法以查找与符号关联的操作.[[我对这个混合的UI /视图代码与逻辑/域代码撕裂,但你提到你想要简单,所以也许这对你的程序是好的.]]
如果将操作封装为对象,则可以考虑使用数据结构来替换类似交换的代码:
如果会有很多操作,请考虑构建一个hashmap以将符号映射到操作.
如果存在少量操作,则可能足够便宜以具有所有操作的集合并且简单地遍历所有操作以询问每个操作是否它们对用户提供的符号起作用并使用第一个找到的操作.