我正在尝试用java实现一个简单的数学解析器。这是针对我的小型学校项目,该项目使用矩阵,可以输入一些简单的方程,例如 A^-1(B+C),然后程序要求输入矩阵 A、B 和 C 并输出这些运算的结果。
到目前为止我得到的是一个名为MathParser的类,它创建Operation类的对象。
Operation 具有诸如 setOperation
(plus、times、inverse、power 之一)和 addInput
(Matrix|Operation|int) 等方法,最后是 executeOperation()
循环 addInput() 中的所有项目并执行 setOperation 中选定的操作。如果它发现输入中的某些项目是类操作的实例,它首先执行它 - 这是一种循环调用。这样做是为了管理运算顺序 - 乘法先于加法等。
但是,我觉得这个解决方案不是很好。您对如何实现这样的任务有什么想法吗?
最佳答案
好吧,也许这个解决方案并不完全是您需要/想要实现的,或者可能是一种矫枉过正,但我会使用一些脚本引擎(例如 Groovy)。在这种情况下,您的代码将如下所示:
GroovyShell shell = new GroovyShell();
shell.setVariable("a",10);
shell.setVariable("b",20);
int result = ((Number) shell.evaluate("(a+b)/2")).intValue();
此外,您还可以解析任何复杂的公式,甚至使用您的特定计算函数。您只需将其全部放入 shell 中,然后计算输入字符串即可。
添加: 默认情况下,运算符不处理矩阵,但使用 groovy 实现它并不难,因为它支持运算符重载(在此处了解更多信息: http://groovy.codehaus.org/Operator+Overloading )
这是一个矩阵示例:
class Matrix {
private int[][] data;
public Matrix(int[][] data) {
this.data = data;
}
public int[][] getData() {
return data;
}
//Method that overloads the groovy '+' operator
public Matrix plus(Matrix b) {
Matrix result = calculateMatrixSumSomehow(this,b);
return result;
}
}
现在您的通话将如下所示:
shell.setVariable("A",new Matrix(...));
shell.setVariable("B",new Matrix(...));
Matrix result = (Matrix)shell.evaluate("A+B"); //+ operator will use 'plus' function
关于java:如何实现数学解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4460631/