zoukankan      html  css  js  c++  java
  • Java数学表示式解析工具- jeval

    这个包可以为我们提高高效的数学表达式计算。
    举个例子:这个是我们策划给出的游戏命中率的一部份计算公式
    是否命中=a命中率 – (b等级 – a等级) * (命中系数(6)* b闪避率 / 100)+32
    为了好看点,我们把他变成:ahit-(blv-alv)*(6*beva/100)+32
    Jeval就是用在这种情况下的!!!!

    Jeval下载地址:http://www.oschina.net/p/jeval 目前最新版本是0.9.4 Beta

    public class EvalTest {
    	
    	private static final double X_VALUE = 1.0;
    	private static final double Y_VALUE = 270;
    
    //	testJeval/testJeval2需要手動包裝變量,testJeval3增加了變量包裝方法
    	public static void main(String[] args) throws Exception {		
    		testJeval();
    		testJeval2();
    		testJeval3();
    	}
    
    	private static void testJeval() throws Exception {
    		String exp = "2 + (7-5) * 3.14159 * #{x} + sin(#{y})";
    
    		// compile
    		Evaluator eva = new Evaluator();
    		
    		eva.putVariable("x", Double.toString(X_VALUE));
    		eva.putVariable("y", Double.toString(Y_VALUE));
    
    		// evaluate
    		double result = Double.parseDouble(eva.evaluate(exp));
    
    		System.out.println(result);//-> 2.0
    	}
    	
    	public static void testJeval2(){
    		// 我们的游戏公式 ahit-(blv-alv)*(6*beva/100)+32
    		String exp = "#{ahit}-(#{blv}-#{alv})*(6*#{beva}/100)+32";
    		Evaluator eva = new Evaluator();
    		try {
    		/** * 添加变量到 Evaluator 类实例.  */
    		eva.putVariable("ahit", "33");
    		eva.putVariable("blv", "10");
    		eva.putVariable("alv", "10");
    		eva.putVariable("beva", "5");
    		/** * 简单输出变量. */
    		/*System.out.println(eva.evaluate("#{ahit}"));
    		System.out.println(eva.evaluate("#{blv}"));
    		System.out.println(eva.evaluate("#{alv}"));
    		System.out.println(eva.evaluate("#{beva}"));*/
    		//公式计算
    		System.out.println(eva.evaluate(exp));
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public static void testJeval3(){
    		// 我们的游戏公式 ahit-(blv-alv)*(6*beva/100)+32
    		String exp = "ahit-(blv-alv)*(6*beva/100)+32";
    		Evaluator eva = new Evaluator();
    		try {
    		/** * 添加变量到 Evaluator 类实例.  */
    		eva.putVariable("ahit", "33");
    		eva.putVariable("blv", "10");
    		eva.putVariable("alv", "10");
    		eva.putVariable("beva", "5");
    		
    		//公式计算
    		System.out.println(eva.evaluate(formatExpression(exp)));
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public static String formatExpression(String exp){
    		//英文字母變量用#{ }包裝:如變量x,#{x}
    		String re = "([a-zA-Z]+)";
    		Pattern pattern = Pattern.compile(re);
    		Matcher matcher = pattern.matcher(exp);
    		StringBuffer sb = new StringBuffer();
    		while(matcher.find()){
    			matcher.appendReplacement(sb, "#{" + matcher.group(1) + "}");
    		}
    		matcher.appendTail(sb);
    		return sb.toString();
    	}
    
    }
    


  • 相关阅读:
    Java 中的 volatile 关键字
    Java 隐式锁
    导致并发程序出问题的根本原因是什么?
    BZOJ_2434_[Noi2011]阿狸的打字机_AC自动机+出栈入栈序+树状数组
    BZOJ_5368_[Pkusc2018]真实排名_组合数
    CF上的3道小题(2)
    BZOJ_4199_[Noi2015]品酒大会_后缀自动机
    BZOJ_4566_[Haoi2016]找相同字符_后缀自动机
    BZOJ_3172_[Tjoi2013]单词_后缀自动机
    BZOJ_3998_[TJOI2015]弦论_后缀自动机
  • 原文地址:https://www.cnblogs.com/kuyuyingzi/p/4266222.html
Copyright © 2011-2022 走看看