我正在用 Java 构建一个简单的计算器,它可以执行基本的算术运算,例如加法
(+)
、减法 (-)
、乘法 (*)
和除法 (/)
。但是,我想避免使用长 if-else
梯子或 switch
案例来确定要执行的操作。
我尝试了以下方法直接将数字和运算符连接成一个字符串,然后将其解析为整数:
class Demo {
public static void main(String[] args) {
String num1 = "10";
String num2 = "20";
String operator = "+";
int val = Integer.parseInt(num1 + operator + num2);
System.out.println(val);
}
}
但是,这会引发
java.lang.NumberFormatException
。我意识到Java的Integer.parseInt
无法解析像10+20
这样的表达式。
有没有一种方法可以在Java中动态计算此类算术表达式,而不使用冗长的
if-else
梯子或switch
?如果没有,实现这一目标最有效的方法是什么?
有。这并不一定意味着它更好。 老狗程序员可能会这样做:
package minicalc;
public interface Operable {
public int operate (int a, int b);
}
接下来,
implement
对每个操作进行操作,并创建一个数组,其中每个元素都是一个实现:
package minicalc;
public class MiniCalc {
class Multiplier implements Operable {
@Override
public int operate (int a, int b) {
return a * b;
}
}
class Divider implements Operable {
@Override
public int operate (int a, int b) {
return a / b;
}
}
class Remainder implements Operable {
@Override
public int operate (int a, int b) {
return a % b;
}
}
class Adder implements Operable {
@Override
public int operate (int a, int b) {
return a + b;
}
}
class Subtractor implements Operable {
@Override
public int operate (int a, int b) {
return a - b;
}
}
final Operable [] operations = {new Adder (), new Subtractor (),
new Multiplier (), new Divider (), new Remainder () };
static final String opCode = "+-*/%";
public int doCalculation (int a, char code, int b)
throws IllegalArgumentException {
int i = opCode.indexOf(code);
if (i < 0) {
throw new IllegalArgumentException ("Invalid operation");
}
return operations[i].operate (a, b);
}
public static void main(String[] args) {
MiniCalc mc = new MiniCalc ();
System.out.println (mc.doCalculation (1,'-', 30));
System.out.println (mc.doCalculation (100, '/', 13));
System.out.println (mc.doCalculation (30, '*', 80));
System.out.println (mc.doCalculation (27, '%', 5));
System.out.println (mc.doCalculation (33,'+', 27));
System.out.println (mc.doCalculation(1000,'x', 22));
}
}