ExpressionCalculator.java 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package com.hotent.util;
  2. import javax.script.ScriptEngine;
  3. import javax.script.ScriptEngineManager;
  4. import javax.script.ScriptException;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. /**
  8. * 提供表达式及参数结合计算结果
  9. */
  10. public class ExpressionCalculator {
  11. /**
  12. * 计算包含变量的表达式
  13. * @param expression 表达式,如 "(c1+c2)*(c1/c2)+c1"
  14. * @param variables 变量映射表,如 {c1=10, c2=5}
  15. * @return 计算结果
  16. */
  17. public static double calculateExpression(String expression, Map<String, Double> variables) {
  18. ScriptEngineManager manager = new ScriptEngineManager();
  19. ScriptEngine engine = manager.getEngineByName("JavaScript");
  20. try {
  21. // 将变量放入引擎
  22. for (Map.Entry<String, Double> entry : variables.entrySet()) {
  23. engine.put(entry.getKey().replace(".","_"), entry.getValue());
  24. }
  25. // 计算表达式
  26. Object result = engine.eval(expression.replace(".","_"));
  27. if (result instanceof Number) {
  28. return ((Number) result).doubleValue();
  29. } else {
  30. throw new RuntimeException("表达式计算结果不是数字: " + result);
  31. }
  32. } catch (ScriptException e) {
  33. throw new RuntimeException("表达式计算错误: " + e.getMessage(), e);
  34. }
  35. }
  36. public static void main(String[] args) {
  37. String expression = "(taiyuan.c1+taiyuan.c2)*(c1/c2)+c1";
  38. // 方式1:手动指定变量值
  39. Map<String, Double> variables1 = new HashMap<>();
  40. variables1.put("c1", 10.0);
  41. variables1.put("c2", 5.0);
  42. variables1.put("taiyuan.c1",1.0);
  43. variables1.put("taiyuan.c2",2.0);
  44. double result1 = calculateExpression(expression, variables1);
  45. System.out.println("表达式: " + expression);
  46. System.out.println("结果: " + result1);
  47. System.out.println();
  48. }
  49. }