Java 计算字符串表达式(字符串代码)

Java 计算字符串表达式(字符串代码)

Java 执行字符串代码的方案有很多中,一般情况下我们计算字符串表达式的场景有:

  • 计算逻辑判断式,并返回判断结果(true,false)
  • 计算表达式值,一般返回结果为数值
  • 根据条件简单拼接字符串,返回结果为拼接文本

我们可以使用 Java 内部自带的 JavaScript 引擎实现上述效果。

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

class Scratch {
    public static void main(String[] args) throws ScriptException {
        ScriptEngineManager manager = new ScriptEngineManager();
        // 创建脚本执行引擎
        ScriptEngine engine = manager.getEngineByName("js");
        // 执行逻辑判断
        final boolean ret = (boolean) engine.eval("1 == 2");
        System.out.println(ret);
    }
}

工具: Hutool

当然,在通常情况下,我们不希望管 ScriptEngineManager 或者 ScriptEngine 什么鬼,只是希望能够计算一个字符串表达式的结果,这里强烈推荐在项目中引入工具包:Hutool。通过这个工具包,我们可以不用管上述两个东西是什么,只需要关注我们的字符串表达式,并且确保表达式的语法符合 JavaScript 语法即可,Hutool文档

Maven 引入工具包坐标:

<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.5.9</version>
</dependency>

代码中执行:

String ret = (String) ScriptUtil.eval("'Hello World'");
// 在执行 js 脚本时,不要使用 return 返回结果,否则会报  Invalid return statement 异常
// 如果想要返回结果,可以直接在脚本末尾给出该变量
System.out.println(ret);// Hello World

即可获取到表达式执行结果。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是Java实现字符串表达式求值的代码: ```java import java.util.Stack; public class ExpressionEvaluation { public static int evaluate(String expression) { Stack<Integer> operands = new Stack<>(); Stack<Character> operators = new Stack<>(); for (int i = 0; i < expression.length(); i++) { char c = expression.charAt(i); if (c == ' ') { continue; } else if (Character.isDigit(c)) { int num = 0; while (i < expression.length() && Character.isDigit(expression.charAt(i))) { num = num * 10 + (expression.charAt(i) - '0'); i++; } i--; operands.push(num); } else if (c == '(') { operators.push(c); } else if (c == ')') { while (operators.peek() != '(') { int result = applyOperator(operators.pop(), operands.pop(), operands.pop()); operands.push(result); } operators.pop(); } else { while (!operators.isEmpty() && precedence(c) <= precedence(operators.peek())) { int result = applyOperator(operators.pop(), operands.pop(), operands.pop()); operands.push(result); } operators.push(c); } } while (!operators.isEmpty()) { int result = applyOperator(operators.pop(), operands.pop(), operands.pop()); operands.push(result); } return operands.pop(); } private static int precedence(char operator) { if (operator == '+' || operator == '-') { return 1; } else if (operator == '*' || operator == '/') { return 2; } else { return 0; } } private static int applyOperator(char operator, int b, int a) { switch (operator) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': if (b == 0) { throw new ArithmeticException("Division by zero"); } return a / b; default: throw new IllegalArgumentException("Invalid operator: " + operator); } } } ``` 以上代码实现了一个静态方法evaluate,接收一个字符串表达式作为参数,返回表达式计算结果。在方法内部,我们使用两个栈,一个用于存储操作数,一个用于存储运算符。然后遍历表达式中的每个字符,如果是空格,则跳过,如果是数字,则将数字解析出来并压入操作数栈中,如果是左括号,则将其压入运算符栈中,如果是右括号,则不断弹出运算符栈中的运算符,直到遇到左括号,同时将弹出的运算符和操作数进行计算,并将计算结果压入操作数栈中。如果是运算符,则不断弹出运算符栈中的运算符,直到栈顶运算符的优先级低于当前运算符的优先级,同时将弹出的运算符和操作数进行计算,并将计算结果压入操作数栈中。最后,当表达式遍历完成后,不断弹出运算符栈中的运算符,同时将弹出的运算符和操作数进行计算,并将计算结果压入操作数栈中,直到运算符栈为空。最后,操作数栈中只剩一个元素,这个元素就是表达式计算结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值