答案 0 :(得分:1)
这听起来很有意思,请问您的申请目的是什么?
最好的办法是建立一个你将支持的已知模式的字典。
我的第一个想法是你应该创建一个接受模式的 ArrayList 。例如:
ArrayList<String> acceptedPatterns = new ArrayList<String>();
acceptedPatterns.add("math.abs");
acceptedPatterns.add("math.acos");
等
然后,当你掌握字符串时,你可以评估这个列表。
String foundPattern = null;
String myStringFromInput = editText.getText();
for (String pattern : acceptedPatterns){
if (myStringFromInput.contains(pattern){
// we have recognised a java method, flag this up
foundPattern = pattern;
break;
}
}
此时你的 foundPattern 变量中会有“Math.abs”。
然后,您可以使用此方法如何计算它的知识。我想不出一种超级有效的方法,但至少让你前进的基本方法就像一个大的if / else语句:
int result = 0;
if (foundPattern.contains("Math.abs"){
result = computeMathAbs(myStringFromInput);
}else if (foundPattern.contains("Math.acos"){
// etc
}
然后在您的 computeMathAbs 方法中,您可以执行以下操作:
private int computeMathAbs(String input){
int indexOfBracket = input.indexOf("(");
int indexOfCloseBracket = input.indexOf(")");
String value = input.subString(indexOfBracket,indexOfCloseBracket);
int valueInt = computeFromString(value);
int result = Math.abs(valueInt);
return result;
}
然后您可以显示传回的结果。
computeFromString()方法将执行类似的操作,查找*符号或其他符号,并将其转换为乘法,如abs示例。
显然这是一个基本的例子,所以你一次只能计算一个java方法,我认为一次编程多个方法的复杂性很难。
您还需要进行相当多的错误处理,并认识到用户可能无法输入完美的java。可以蠕虫。
答案 1 :(得分:0)
您可以使用Groovy
http://groovy.codehaus.org/api/groovy/util/Eval.html
import groovy.util.Eval;
...
HashMap<String, Object> params = new HashMap<String, Object>();
params.put("a", 2);
params.put("b", 3);
Integer res = (Integer) Eval.me("param", params, "Math.abs(param.a * param.b)");
System.out.println("res with params = " + res);
System.out.println("res without params = " + Eval.me("Math.abs(2*3)"));