Tags: Java

Obliczanie Wyrażeń Matematycznych w Java

W Javie, obliczenie wyrażenia matematycznego zapisanego jako ciąg znaków wymaga sparsowania tego ciągu i wykonania operacji matematycznych w odpowiedniej kolejności. Java nie ma wbudowanej funkcji ewaluacji wyrażeń matematycznych, ale można to osiągnąć na kilka sposobów:

Użycie `ScriptEngineManager`

Java zawiera skryptowy silnik JavaScript (Nashorn w Javie 8 i starszych, GraalVM w nowszych wersjach), który może być użyty do ewaluacji wyrażeń matematycznych zapisanych jako ciągi znaków.

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

public class MathEvaluator {
public static void main(String[] args) throws ScriptException {
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");

String expression = "3 * (2 + 1)";
Object result = engine.eval(expression);

System.out.println(expression + " = " + result);
}
}

Pisanie własnego parsera

Można napisać własną implementację parsera i ewaluatora, który rozpozna liczby, operatory i nawiasy, a następnie obliczy wartość wyrażenia. To podejście wymaga dobrej znajomości algorytmów takich jak algorytm shunting-yard dla konwersji wyrażeń do notacji odwrotnej polskiej (RPN) lub bezpośredniej implementacji parsera rekurencyjnego.

Użycie zewnętrznych bibliotek

Istnieją biblioteki, takie jak Apache Commons JEXL, MVEL, lub ANTLR, które mogą być użyte do parsowania i ewaluacji wyrażeń matematycznych.

Przykładowo, użycie biblioteki Apache Commons JEXL:

import org.apache.commons.jexl3.JexlBuilder;
import org.apache.commons.jexl3.JexlEngine;
import org.apache.commons.jexl3.JexlExpression;

public class MathEvaluator {
public static void main(String[] args) {
JexlEngine jexl = new JexlBuilder().create();

String expression = "3 * (2 + 1)";
JexlExpression jexlExpression = jexl.createExpression(expression);

Object result = jexlExpression.evaluate(null);

System.out.println(expression + " = " + result);
}
}

Przed użyciem którejkolwiek z tych metod upewnij się, że rozumiesz ich ograniczenia, szczególnie jeśli chodzi o obsługę bardziej złożonych wyrażeń matematycznych lub bezpieczeństwo (np. wykonanie złośliwego kodu przez `ScriptEngineManager`).