java算术表达式_一文了解如何用Java进行算术表达式计算

更新时间:2023-06-06 13:08:05 阅读: 评论:0

java算术表达式_⼀⽂了解如何⽤Java进⾏算术表达式计算(给ImportNew加星标,提⾼Java技能)
编译:ImportNew/唐尤华
如何⽤Java计算"5+3"、"10-40"、"10*3"这样的算术表达式?本⽂介绍了可使⽤的常见⽅法及各⾃优缺点。
1. JDK Javascript引擎
JDK1.6开始,提供了Javascript脚本引擎。可以把 String 形式的字符串通过 engine.eval() ⽅法执⾏计算。⽰例如下:
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
public class Test {
public static void main(String[] args) throws ScriptException{
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = EngineByName("JavaScript");
String foo = "40+2";
System.out.println(engine.eval(foo));
}
}
Java中的ScriptEngine理论上⽀持符合ECMAScript规范的语⾔。要确认当前Java⽀持哪些语⾔,可以执⾏下列代码:
import java.util.List;
import javax.script.ScriptEngineManager;
星期一的英文单词import javax.script.ScriptEngine;
import javax.script.Bindings;
import javax.script.ScriptContext;
import javax.script.ScriptEngineFactory;
public class Test {
public static void main(String[] args){
ScriptEngineManager mgr = new ScriptEngineManager();
List factories = EngineFactories();
for (ScriptEngineFactory factory : factories)
{
System.out.println("ScriptEngineFactory Info");
String engName = EngineName();
String engVersion = EngineVersion();
String langName = LanguageName();
String langVersion = LanguageVersion();
System.out.printf("tScript Engine: %s (%s)n", engName, engVersion);
List engNames = Names();
for (String name : engNames)
{foolish
System.out.printf("tEngine Alias: %sn", name);
}
System.out.printf("tLanguage: %s (%s)n", langName, langVersion);
}
}
}
执⾏完毕会看到ScriptEngine⽀持的语⾔。在我的机器上(java version "1.8.0_191")运⾏会看到下⾯的结果:
ScriptEngineFactory Info
Script Engine: Oracle Nashorn (1.8.0_191)
Engine Alias: nashorn
Engine Alias: Nashorn
Engine Alias: js
Engine Alias: JS
Engine Alias: JavaScript
Engine Alias: javascript
Engine Alias: ECMAScript
Engine Alias: ecmascript
Language: ECMAScript (ECMA - 262 Edition 5.1)
JDK⽀持的JavaScript来⾃Mozilla Rhino ECMAScript。Rhino 是⼀个完全使⽤Java语⾔编写的开源JavaScript实现。Rhino通常⽤在Java程序中,为最终⽤户提供脚本化能⼒。它被作为J2SE 6上的默认Java脚本化引擎。
既然⽀持脚本,那么就不仅限于普通的算术运算符,还可以使⽤Javascript中的Math函数。⽐如像下⾯这样:
String foo = "s(60)+Math.sin(30)";
System.out.println(engine.eval(foo));
// 输出 -1.9404446045080181
还可以⽀持变量。⽐如上⾯的例⼦中,两个⾓度分别⽤变量表⽰:
engine.put("angle1", 60);
engine.put("angle2", 30);
String bar = "s(angle1)+Math.sin(angle2)";
System.out.println(engine.eval(bar));
// 输出 -1.9404446045080181
这种⽅法的缺点在于,脚本本⾝可能有潜在的安全性问题,容易收到攻击。不推荐在服务端使⽤。
2. 第三⽅开发库
在Java的世界⾥,永远有丰富的第三⽅开发库可供选择,计算算术表达式也⼀样。下⾯列举⼀些常⽤的开发库。JEXL
妇女节英文commons.apache/proper/commons-jexl/
Java Expression Language (JEXL) 是⼀个表达式语⾔引擎,可以⽤来在应⽤或者框架中使⽤。使⽤⽰例:
yeepay// 假设有⼀个名为 jexl 的类, 初始化了 JexlEngine 实例:
// 创建⼀个表达式对象进⾏计算
String calculateTax = TaxCalc(); //e.g. "((G1 + G2 + G3) * 0.1) + G4";
Expression e = ateExpression( calculateTax );
// 填写上下⽂
JexlContext context = new MapContext();
context.t("G1", TotalSales());
context.t("G2", Year()));
context.t("G3", IntercompanyPayments());
context.t("G4", -Allowances());allofthem汉语意思
// ...
/
/ 得到计算结果
Number result = (Number) e.evaluate(context);
illumination
更多内容可参见官⽹⽰例。
mXparr
mathparr/
mXparr的优点是⽀持多平台,Java、Android、dotNET等。
使⽤⽰例:
package mxparr.helloworld;
import org.parr.*;
public class HelloWorld {
public static void main(String[] args){
Expression eh = new Expression("5^2 * 7^3 * 11^1 * 67^1 * 49201^1");
Expression ew = new Expression("71^1 * 218549^1 * 6195547^1");
String h = mXparr.numberToAsciiString( eh.calculate() );
String w = mXparr.numberToAsciiString( ew.calculate() );
}
}
EvalEx
使⽤⽰例:
new Expression("123456789 + 123456789").eval(); // 246913600
new Expression("123456789 + 123456789")
.tPrecision(12)
.eval(); // 246913578
⽤于Java算术表达式计算的第三⽅库还有许多,这⾥不再⼀⼀列举。
3. ⾃⼰动⼿
要计算算术表达式计算,还可以⾃⼰动⼿实现Parr。有许多有名的算法,⽐如Dijkstra的双堆栈算法计算表达式。参考实现如下:/******************************************************************************
* Compilation: javac Evaluate.java
* Execution: java Evaluate
* Dependencies: Stack.java
*
* Evaluates (fully parenthesized) arithmetic expressions using
* Dijkstra's two-stack algorithm.
*
* % java Evaluate
* ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) )
* 101.0
*
* % java Evaulate
* ( ( 1 + sqrt ( 5 ) ) / 2.0 )
* 1.618033988749895
*
*
* Note: the operators, operands, and parenthes must be
步步高点读机下载
* parated by whitespace. Also, each operation must
* be enclod in parenthes. For example, you must write
anthony weiner* ( 1 + ( 2 + 3 ) ) instead of ( 1 + 2 + 3 ).
* See EvaluateDeluxe.java for a fancier version.
*
*
* Remarkably, Dijkstra's algorithm computes the same
* answer if we put each operator *after* its two operands
* instead of *between* them.
*
* % java Evaluate
* ( 1 ( ( 2 3 + ) ( 4 5 * ) * ) + )
* 101.0
*
* Moreover, in such expressions, all parenthes are redundant!
* Removing them yields an expression known as a postfix expression. * 1 2 3 + 4 5 * * +
*
*
******************************************************************************/
public class Evaluate {
public static void main(String[] args){
Stack ops = new Stack();
Stack vals = new Stack();
while (!StdIn.isEmpty()) {
String s = adString();
if (s.equals("(")) ;
el if (s.equals("+")) ops.push(s);
the reader
el if (s.equals("-")) ops.push(s);
el if (s.equals("*")) ops.push(s);
el if (s.equals("/")) ops.push(s);发现身边的美
el if (s.equals("sqrt")) ops.push(s);

本文发布于:2023-06-06 13:08:05,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/78/884355.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:表达式   计算   脚本   算术
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图