ExpressionJ 解析简单的算术,expressionj算术,ExpressionJ
分享于 点击 16457 次 点评:138
ExpressionJ 解析简单的算术,expressionj算术,ExpressionJ
ExpressionJ 是一个用来解析简单的算术表达式的 Java 类库。
Function
package common.statistics;/** * User: caiyuan * Date: 2011/11/02 18:20 */public interface Function {}
Stat
package common.statistics;import java.util.Arrays;/** * User: caiyuan * Date: 2011/11/01 17:59 */public class Stat implements Function { // 求和 public double sum(double[] number) { double result = 0; for (double num : number) { result += num; } return result; } // 求平均值 public double average(double[] number) { double result = sum(number); result = result / number.length; return result; } // 求最小值 public double min(double[] number) { double result = number[0]; for (double num : number) { if (num < result) { result = num; } } return result; } // 求最大值 public double max(double[] number) { double result = number[0]; for (double num : number) { if (num > result) { result = num; } } return result; } // 返回数值列表的长度 public int count(double[] number) { return number.length; } // 返回大于scalar的数值列表 public double[] gt(double[] number, double scalar) { double[] result = new double[number.length]; int count = 0; for (int i = 0; i < number.length; i++) { double num = number[i]; if (num > scalar) { result[i] = num; count += 1; } } return Arrays.copyOf(result, count); } // 返回小于scalar的数值列表 public double[] lt(double[] number, double scalar) { double[] result = new double[number.length]; int count = 0; for (int i = 0; i < number.length; i++) { double num = number[i]; if (num < scalar) { result[i] = num; count += 1; } } return Arrays.copyOf(result, count); } // 返回等于scalar的数值列表 public double[] eq(double[] number, double scalar) { double[] result = new double[number.length]; int count = 0; for (int i = 0; i < number.length; i++) { double num = number[i]; if (num == scalar) { result[i] = num; count += 1; } } return Arrays.copyOf(result, count); }}
EquationUtil
package common.statistics;import org.da.expressionj.expr.parser.EquationParser;import org.da.expressionj.expr.parser.ParseException;import org.da.expressionj.functions.FunctionsDefinitions;import org.da.expressionj.model.Equation;import org.da.expressionj.model.Variable;import java.lang.reflect.Method;import java.util.HashMap;import java.util.Map;public class EquationUtil { private final Map<String, Equation> equations; private static FunctionsDefinitions def; public EquationUtil() { equations = new HashMap<String, Equation>(); def = FunctionsDefinitions.getInstance(); } /** * 注册函数 */ public void register(Class<? extends Function> clz) throws IllegalAccessException, InstantiationException { Function func = clz.newInstance(); Method[] methods = clz.getMethods(); for (Method method : methods) { def.addFunction(method.getName(), func, method); } } /** * 释放注册的函数 */ public static void reset() { def.reset(); } /** * 根据表达式语句获得方程式对象 */ public Equation getEquation(String expr) throws ParseException { Equation equation = equations.get(expr); if (equation == null) { equation = EquationParser.parse(expr); equations.put(expr, equation); } return equation; } /** * @param expr 表达式语句 * @param o 参与运算的键值对列表,键必须与表达式中参数名相同 */ public Object evaluate(String expr, Map<String, Object> o) throws ParseException { Equation equation = getEquation(expr); Map<String, Variable> vars = equation.getVariables(); for (String key : vars.keySet()) { vars.get(key).setValue(o.get(key)); } return equation.eval(); }}
testStat
package common.statistics;import org.da.expressionj.expr.parser.ParseException;import org.junit.Before;import org.junit.Test;import java.util.HashMap;import java.util.Map;/** * User: caiyuan * Date: 2011/11/02 11:10 */public class testStat { private EquationUtil equationUtil; @Before public void before() throws InstantiationException, IllegalAccessException { equationUtil = new EquationUtil(); equationUtil.register(Stat.class); } @Test public void f() throws ParseException { // 从配置中直接读取 String expr = "sum(a)"; // 从通过配置动态获取 Map<String, Object> o = new HashMap<String, Object>(); o.put("a", new double[]{1, 2, 3, 4, 5}); Object result = equationUtil.evaluate(expr, o); System.out.println(result); } @Test public void t() throws ParseException { String expr = "a + 1"; Map<String, Object> o = new HashMap<String, Object>(); o.put("a", 2); Object result = equationUtil.evaluate(expr, o); System.out.println(result); } @Test public void q() throws ParseException { String expr = "count(gt(a,0))"; Map<String, Object> o = new HashMap<String, Object>(); o.put("a", new double[]{1, 2, 3, 4, 5}); Object result = equationUtil.evaluate(expr, o); System.out.println(result); } @Test public void r() throws ParseException { // 多个表达式中的变量名不可重复 Equation condition = EquationParser.parse("sin(a)"); Equation condition2 = EquationParser.parse("b + c"); Expression expr = condition2.getExpression(); ExpressionCombiner combiner = new ExpressionCombiner(); Expression exprResult = combiner.replace(condition, "a", expr); exprResult.getVariable("b").setValue(1); exprResult.getVariable("c").setValue(2); System.out.println(condition.eval()); }}
用户点评