我有一个像下面这样的字符串:
String str = "4*5";
Run Code Online (Sandbox Code Playgroud)
现在我必须20通过使用字符串来获得结果.
我知道在其他一些语言中,这个eval()功能会做到这一点.我怎么能用Java做到这一点?
Java中是否有一种方法可以从这个数学表达式中获得结果:
String code = "5+4*(7-15)";
Run Code Online (Sandbox Code Playgroud)
另一方面,解析算术表达式的最佳方法是什么?
我一直在努力在JavaScript中实现Shunting-Yard算法.
到目前为止,这是我的工作:
var userInput = prompt("Enter in a mathematical expression:");
var postFix = InfixToPostfix(userInput);
var result = EvaluateExpression(postFix);
document.write("Infix: " + userInput + "<br/>");
document.write("Postfix (RPN): " + postFix + "<br/>");
document.write("Result: " + result + "<br/>");
function EvaluateExpression(expression)
{
var tokens = expression.split(/([0-9]+|[*+-\/()])/);
var evalStack = [];
while (tokens.length != 0)
{
var currentToken = tokens.shift();
if (isNumber(currentToken))
{
evalStack.push(currentToken);
}
else if (isOperator(currentToken))
{
var operand1 = evalStack.pop();
var operand2 = evalStack.pop();
var result = PerformOperation(parseInt(operand1), parseInt(operand2), currentToken); …Run Code Online (Sandbox Code Playgroud) 是否有可能以某种方式在SQLite中创建内存数据库,然后通过某些查询销毁它?
我需要这样做才能对我的数据库层进行单元测试.到目前为止,我只是通过创建正常的SQLite db文件并在所有测试后删除,但在内存中完成所有操作会好得多.
那么是否可以仅在内存中实例化数据库而无需向光盘写入任何内容?我不能只使用事务,因为我想创建全新的数据库.
我必须将项目从 Java 8 迁移到 Java 17。
我可以解决大多数问题,但它包含一个方法,在该方法中我使用 ScriptEngineManager 来评估数学术语。
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine e = mgr.getEngineByName("JavaScript");
String t = "5*7";
if (isMathTerm(t)) {
System.out.println(e.eval(t).toString());
}
Run Code Online (Sandbox Code Playgroud)
在 Java 8 中它按要求工作,但在 Java 17 中e始终为 null。
据谷歌称,Java 17 不再支持 JavaScript 引擎。
由于项目限制,我不允许使用第三方库。
Java 17 中有没有正确的方法来处理这个问题?
我想用VB计算一个字符串的算术表达式,任何想法?
作为一个例子:文本框中的"x + 2",我想评估表达式
假设我已经编写了一个函数来评估一个简单的数学运算,并且我在字符串中有一些用户输入,例如:"1 + [2 + [3 + 4]]"如何解析这些方括号并首先提取最里面的文本(3 + 4),评估它,然后解析外括号(2 + 7)?我对正则表达式搜索和替换有基本的了解,但我知道他们不会像这样做递归.我想要一些基本的java代码来做到这一点,如果我可以避免它,还不是另一个jar/API.
我正在尝试编写一个String评估函数,即
evaluate("4 + 1") ; // returns 5
evaluate("4 + 1 + 3") ; // returns 8
evaluate("4 + 1 * 3") ; // returns 7 (not 15)
The operators are + - / and *
Run Code Online (Sandbox Code Playgroud)
我的初期是使用正则表达式来收集运算符和数字,因为这些可以匹配.并且在找到该信息之后,以某种方式找出了优先考虑/*ove -+运营商的方法.
这是我开始的方式:
static String regex = "([\\+\\*-/])+";
static String digitRegex = "(\\d)+";
public static void main(String[] args) {
System.out.println(getOperators("4 + 1 * 3"));
}
public static List<String> getOperators(String input) {
Pattern p = Pattern.compile(regex);
Matcher matcher = p.matcher(input);
List<String> operatorList …Run Code Online (Sandbox Code Playgroud) 我需要实现函数public int eval(String infix) {...}
,当我像这样使用它时:
eval("3+2*(4+5)")
Run Code Online (Sandbox Code Playgroud)
我必须得到21.
算术表达式可以包含'+','*'和括号.
那么,我怎样才能将其转换为数学方程?我不能使用非标准的库.
更新:找到解决方案.
它是2种方式:波兰表示法和使用ScriptEngine.
我bsh-2.0b4.jar通过进入Project structure -> Modules -> myProject -> Tab-Dependencies -> + Sign然后添加.jar文件将外部库添加到android-studio中的android项目中.我还尝试将文件复制到/ libs目录,然后在工作室中右键单击add as library...(两种方法独立!!).我插入以下代码作为测试
import bsh.Interpreter;
...
Interpreter interpreter = new Interpreter();
interpreter.eval("result = (7+21*6)/(32-27)");
return interpreter.get("result").toString();
Run Code Online (Sandbox Code Playgroud)
我用android中的buildin按钮编译.build.gradle看起来像:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.5.+'
}
}
apply plugin: 'android'
repositories {
mavenCentral()
}
android {
compileSdkVersion 17
buildToolsVersion "17.0.0"
defaultConfig {
minSdkVersion 9
targetSdkVersion 17
}
}
dependencies {
compile 'com.android.support:support-v4:13.0.+'
}
Run Code Online (Sandbox Code Playgroud)
但是当我编译所有内容时,我收到错误
Gradle: error: package bsh does not exist …Run Code Online (Sandbox Code Playgroud) java ×7
eval ×2
math ×2
parsing ×2
algorithm ×1
android ×1
evaluation ×1
expression ×1
gradle ×1
java-17 ×1
javascript ×1
jdbc ×1
scriptengine ×1
sqlite ×1
string ×1
vb.net ×1