欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

ExpressionJ 解析简单的算术,expressionj算术,ExpressionJ

来源: javaer 分享于  点击 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());    }}
相关栏目:

用户点评