我正在尝试简化此if语句以避免代码重复和if语句。我还希望能够传递超过2个参数。即5 + 10 * 2/2。有什么想法吗?
public static double randomExpressionDraft(String exp){
double primeResult = 0;
double newResult = 0;
for(int i=0;i<exp.length();i++)
{
if(exp.charAt(i)=='*')
{
newResult=Integer.parseInt(exp.substring(0, i)) * Integer.parseInt(exp.substring(i+1, exp.length()));
primeResult = newResult;
System.out.println(primeResult);
}
else if(exp.charAt(i)=='/')
{
newResult=Integer.parseInt(exp.substring(0, i)) / Integer.parseInt(exp.substring(i+1, exp.length()));
primeResult = newResult;
System.out.println(primeResult);
}
else if(exp.charAt(i)=='+')
{
newResult=Integer.parseInt(exp.substring(0, i)) + Integer.parseInt(exp.substring(i+1, exp.length()));
primeResult = newResult;
System.out.println(primeResult);
}
else if(exp.charAt(i)=='-')
{
newResult=Integer.parseInt(exp.substring(0, i)) - Integer.parseInt(exp.substring(i+1, exp.length()));
primeResult = newResult;
System.out.println(primeResult);
}
}
return primeResult;
}
答案 0 :(得分:0)
你的循环应该得到操作*/-+
将Integer.parseInt(exp.substring(0, i))
移至某个功能,例如getLeftArg
对Integer.parseInt(exp.substring(i+1, exp.length()));
执行相同操作,例如getRightArg
然后使用params leftArg,rightArg,operation
创建新方法代码的其余部分是相同的
即。
newResult= newMethod (leftArg, rightArg, operation)
您的计算加上primeResult = newResult; System.out.println(primeResult);
答案 1 :(得分:0)
由于Java没有像委托这样的东西,除非你在Object中定义每个运算符,否则你将无法像你想的那样实现循环。如果你想要最简单的代码,这是Mauricio从similar question得到的解决方案:
ScriptEngineManager scm = new ScriptEngineManager();
ScriptEngine jsEngine = scm.getEngineByName("JavaScript");
double primeResult = (double)jsEngine.eval(exp);
是的,获取JavaScript引擎来评估算术表达式有点矫枉过正。但是,它显然可以处理多个运算符,因此您不必自己解析它。
答案 2 :(得分:0)
对于这类问题,我认为最优雅的方法是使用多态和枚举类型而不是switch语句。
以下代码来自Effective Java - 第6章,Joshua Bloch。
public enum Operation {
PLUS("+") {
double apply(double x, double y) { return x + y; }
},
MINUS("-") {
double apply(double x, double y) { return x - y; }
};
private final String symbol;
Operation(String symbol) { this.symbol = symbol; }
@Override public String toString() { return symbol; }
abstract double apply(double x, double y);
private static final Map<String, Operation> stringToEnum = new HashMap<>();
static {
for(Operation op : values())
stringToEnum.put(op.toString(), op);
}
public static Operation fromString(String symbol) {
return stringToEnum.get(symbol);
}
}
然后,应用操作:
double result = Operation.fromString("+").apply(1, 1); // 2.0
result = Operation.fromString("-").apply(1,1); // 0.0