2012-12-01 41 views
4

我需要实现的功能public int eval(String infix) {...} ,当我用这个像这样:Java字符串以数学方程式

eval("3+2*(4+5)") 

我必须接受21

算术表达式可以包含“+”,“* '和括号。

那么,我该如何将其转换为数学方程? 我不能使用非标准的库。

更新: 找到解决方案。

它是2种方式:波兰语法和使用ScriptEngine。


+5

那你试试这么远吗? – Maroun

+0

提示:[BODMAS](http://en.wikipedia.org/wiki/Order_of_operations),[stack](http://docs.oracle.com/javase/6/docs/api/java/util/Stack。 HTML)。 – Prasanth

+0

我把'String'发送给'eval'。 – JohnDow

回答

10

信不信由你,用JDK1.6,你可以使用内置的JavaScript引擎。定制以满足您的需求。

请确保您有这些进口...

import javax.script.ScriptEngineManager; 
import javax.script.ScriptEngine; 

代码:

ScriptEngineManager mgr = new ScriptEngineManager(); 
ScriptEngine engine = mgr.getEngineByName("JavaScript"); 
String infix = "3+2*(4+5)"; 
System.out.println(engine.eval(infix)); 
+0

JavaScript以外的各种引擎名称是否可用? – vikiiii

+0

@vikiiii Just Javascript - http://www.java2s.com/Code/JavaAPI/javax.script/ScriptEngineFactorygetEngineName.htm - 输出 - Mozilla Rhino,1.7发布3 PRERELEASE,ECMAScript,1.8,[js],[application/javascript ,application/ecmascript,text/javascript,text/ecmascript],[js,rhino,JavaScript,javascript,ECMAScript,ecmascript] – xagyg

2

那么首先,你想要标记字符串。基本上,分离每个元素。将操作与个别号码分开,并将它们存储在某些内容中(可能是一个列表)。然后按照操作顺序进行操作。

所以伪代码会是这样的:

public int eval(String infix) 
{ 
    create a list of all the elements 
    identify which operations you would want to do first 
    perform the operations and simplify the list (e.g. if 5x4 were inside parantheses, remove the parantheses and replace it overall with 20.) 
    continue the simplification until you have a final result 
    return the result 
} 

可能有更好的方法来做到这一点,但这里有一个解决方案。

0
static int eval(String infix) {   
     ScriptEngineManager mgr = new ScriptEngineManager(); 
     ScriptEngine engine = mgr.getEngineByName("JavaScript");  
     String stringResult; 
     try { 
      stringResult = engine.eval(infix).toString(); 
      double doubleResult = Double.parseDouble(stringResult); 
      int result = (int) doubleResult;   
      return result; 
     } catch (ScriptException ex) { 
      Logger.getLogger(Ukol4a.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     return(1); 

    } 
相关问题