Originariamente inviata da
andbin
Scusa ma ... il Nashorn non andava bene?
Questo l'ho scritto velocemente:
codice:
import javax.script.Bindings;
import javax.script.Compilable;
import javax.script.CompiledScript;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class Prova {
public static void main(String[] args) throws ScriptException {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("Nashorn");
CompiledScript compiledExpr = ((Compilable) engine).compile("3*Math.pow(x, 2) - 15*x + 20");
Bindings bindings = engine.createBindings();
for (double x = 0; x <= 10; x += 0.1) {
bindings.put("x", x);
double result = (double) compiledExpr.eval(bindings);
System.out.printf("x=%.5f --> %f%n", x, result);
}
}
}
Giusto alcune note:
Compilable è una interfaccia che un ScriptEngine può opzionalmente implementare (non è obbligatorio). Il Nashorn la implementa. In questo modo si può "precompilare" l'espressione in modo che sia ri-eseguibile molto velocemente. Chiaramente il compile può fallire con ScriptException. Non l'ho gestita bene solo per brevità.
Con il Bindings si possono "iniettare" valori nella espressione. Ho scritto una espressione matematica pensata a caso (equazione di 2° grado).
Funziona sia con il Nashorn built-in del JDK che con quello messo come dipendenza esplicita (es. con Maven).
Non l'ho letto tutto in dettaglio .... ma a me sembra scritto un po' maluccio (e fumoso). Sia stilisticamente, sia per cose non molto appropriate tipo
if (numero!="")
Per fare un parser di espressioni matematiche si dovrebbero applicare i concetti che portano alla creazione di un "albero" di nodi, come è descritto qui:
https://www.openbookproject.net/book...ParseTree.html
Quindi, in sostanza, se NON hai applicato un concetto del genere ...... hai totalmente sbagliato approccio.