啥都不说了直接上代码
public class TestSimpleExpression
{
public static void main(String[] str)
{
try
{
Map<String, Integer> map=new HashMap();
map.put("x", 4);
map.put("y", 5);
map.put("z", 7);
map.put("d", 2);
String str1 = "[[x]]+[[y]]*[[z]]/[[d]]+[[x]]";
str1 = str1.replaceAll("\\[\\[(.*?)\\]\\]","map.get(\"$1\")");
System.out.println(str1);
}
catch (Exception e)
{
System.out.println("Error: " + e);
}
}
}
一开始想的乐观了,以为这样替换之后应该能直接算出一个结果,结果只是进行了相应替换,有没有办法,替换之后直接可以进行计算……
public class TestSimpleExpression
{
public static void main(String[] str)
{
try
{
Map<String, Integer> map=new HashMap();
map.put("x", 4);
map.put("y", 5);
map.put("z", 7);
map.put("d", 2);
String str1 = "[[x]]+[[y]]*[[z]]/[[d]]+[[x]]";
str1 = str1.replaceAll("\\[\\[(.*?)\\]\\]","map.get(\"$1\")");
System.out.println(str1);
}
catch (Exception e)
{
System.out.println("Error: " + e);
}
}
}
一开始想的乐观了,以为这样替换之后应该能直接算出一个结果,结果只是进行了相应替换,有没有办法,替换之后直接可以进行计算……
解决方案 »
- 有两个疑惑,请各位大叔大婶指点一下:TreeSet是怎么排序的?接口中的方法为什么可以不用全部实现?
- 使用java读取xlsx格式的execl,除了poi还有哪些方式?
- java程序访问一个网站次多了就被限制IP了怎么处理?
- 一道面试题(农夫买鸡)(网博面试)
- 求java类库中文版
- struts jsp自动加载数据显示
- MyEclipse 生成webservice 错误 怎么解决
- 如何得到JComboBox和JTextField里面的数据
- 请提供一些Lucene的例子
- 问一个时加减的问题,谢谢了,很急!!!!!!!!!!!!!
- 存储ResultSet 问题
- 超链接传参数时,参数长度超出,怎么解决?
参考:ScriptEngine这个类的eval方法
import javax.script.ScriptEngineManager;public class TestSimpleExpression {
public static void main(String[] str) {
try {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("var map=[];map[\"x\"]=");
stringBuilder.append(4);
stringBuilder.append(";map[\"y\"]=");
stringBuilder.append(5);
stringBuilder.append(";map[\"z\"]=");
stringBuilder.append(7);
stringBuilder.append(";map[\"d\"]=");
stringBuilder.append(2);
stringBuilder.append(";");
String str1 = "[[x]]+[[y]]*[[z]]/[[d]]+[[x]];";
str1 = str1.replaceAll("\\[\\[(.*?)\\]\\]", "map[\"$1\"]");
stringBuilder.append(str1); ScriptEngine javaScriptEngine = (new ScriptEngineManager()) .getEngineByExtension("js");
System.out.println(javaScriptEngine.eval(stringBuilder.toString()));
} catch (Exception e) {
e.printStackTrace();
}
}
}
try {
Map<String, Integer> map = new HashMap();
map.put("x", 4);
map.put("y", 5);
map.put("z", 7);
map.put("d", 2); String str1 = "[[x]]+[[y]]*[[z]]/[[d]]+[[x]]";
str1 = str1.replaceAll("\\[\\[(.*?)\\]\\]", "map.get(\"$1\")");
str1 =( map.get("x")+map.get("y")*map.get("z")/map.get("d")+map.get("x"))+"";
System.out.println(str1); } catch (Exception e) {
System.out.println("Error: " + e);
}
换成map中对应元素的值,比如[[x]]换成map.get("x")的值即4,其他依次类推
import java.io.DataOutputStream;
import java.io.FileOutputStream;public class TestSimpleExpression2 {
private double x = 4;
private double y = 5;
private double z = 7;
private double d = 2;
private void compile() throws Throwable {
String str1 = "[[x]]+[[y]]*[[z]]/[[d]]+[[x]]";
str1 = str1.replaceAll("\\[\\[(.*?)\\]\\]","map.get(\"$1\")");
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("import java.util.HashMap;");
stringBuilder.append("import java.util.Map;");
stringBuilder.append("public class TestSimle {");
stringBuilder.append("private static Map<String, Double> map = new HashMap<String, Double>();");
stringBuilder.append("public static double calculate() {");
stringBuilder.append("map.put(\"x\",");
stringBuilder.append(this.x);
stringBuilder.append(");map.put(\"y\",");
stringBuilder.append(this.y);
stringBuilder.append(");map.put(\"z\",");
stringBuilder.append(this.z);
stringBuilder.append(");map.put(\"d\",");
stringBuilder.append(this.d);
stringBuilder.append(");return ");
stringBuilder.append(str1);
stringBuilder.append(";}}");
DataOutputStream ostream = new DataOutputStream(new FileOutputStream("bin/TestSimle.java"));
ostream.writeBytes(stringBuilder.toString());
ostream.close();
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("cmd /c javac bin/TestSimle.java");
process.waitFor();
DataInputStream iStream = new DataInputStream(process.getInputStream());
byte[] readBytes = new byte[1024];
iStream.read(readBytes);
String result = new String(readBytes);
if (result.indexOf("Exception") >= 0) throw new Throwable(result);
}
public void calculate() throws Throwable {
this.compile();
System.out.println(Class.forName("TestSimle").getMethod("calculate").invoke(null, new Object[]{}));
}
public static void main(String[] args) throws Throwable {
new TestSimpleExpression2().calculate();
}
}
str1 = str1.replaceAll("\\[\\[(.*?)\\]\\]", "map.get(\"$1\")");
你这个替换,肯定只是完成了替换拉,并没有完成计算。但替换后不是得到了表达式了嘛,你再调用一下这个表达式,就是计算了。
powerlee2008,ticmy,谢谢你们,我现在在jdk1.5下使用了包commons-logging-1.1.1.jar、commons-jexl-2.0.1.jar、bsf-api-3.1.jar,但是debug发现在这句
ScriptEngine javaScriptEngine = (new ScriptEngineManager()).getEngineByExtension("js");
获得的javaScriptEngine 是 null,这个怎么解决啊
import java.util.HashMap;
import java.util.Map;import org.codehaus.commons.compiler.CompileException;
import org.codehaus.janino.ExpressionEvaluator;public class JaninoTest { public static void main(String[] args) throws CompileException, InvocationTargetException {
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("x", 4);
map.put("y", 5);
map.put("z", 7);
map.put("d", 2); String str = "[[x]]+[[y]]*[[z]]/[[d]]+[[x]]"; str = str.replace("[[", "").replace("]]", ""); System.out.println(eval(str, map, double.class));
} /**
* 计算表达式
*
* @param <T> 返回类型
* @param str 表达式
* @param args 参数
* @param returnType 返回类型
* @return
* 2011-5-13 下午05:02:06
*/
@SuppressWarnings("unchecked")
public static <T> T eval(String str, Map<String, ? extends Number> args, Class<T> returnType) { String[] argNames = new String[args.size()];
Number[] argValues = new Number[args.size()];
Class<?>[] argTypes = new Class[args.size()];
int k = 0;
for(Map.Entry<String, ? extends Number> entry : args.entrySet()) {
argNames[k] = entry.getKey();
argValues[k] = entry.getValue();
argTypes[k] = entry.getValue().getClass();
k++;
} ExpressionEvaluator evaluator = new ExpressionEvaluator();
evaluator.setExpressionType(returnType);
evaluator.setParameters(argNames, argTypes);
try {
evaluator.cook(str);
return (T)evaluator.evaluate(argValues);
} catch (CompileException e) {
e.printStackTrace();
return null;
} catch (InvocationTargetException e) {
e.printStackTrace();
return null;
}
}
}
Error: javax.script.ScriptException: org.apache.commons.jexl2.JexlException: org.apache.commons.jexl2.scripting.JexlScriptEngine.eval@214 parsing failed
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class Test {
public static void main(String[] args) throws ScriptException {
String exp = "[[x]]+[[y]]*[[z]]/[[d]]+[[x]]";
exp = exp.replaceAll("\\[", "").replaceAll("\\]", "");
System.out.println(exp);
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine scriptEngine = manager.getEngineByName("jexl");
scriptEngine.put("x", 2);
scriptEngine.put("y", 3);
scriptEngine.put("z", 4);
scriptEngine.put("d", 5);
Object result = scriptEngine.eval(exp);
System.out.println("结果:" + result + " ;类型:" + result.getClass().getName());
}
}