Hallo,
mein Problem ist das folgende: ich kriege als Information einen String, in dem eine (mathematische) Funktion steht... z.B. "x*x". Nun möchte ich, dass diese Funktion ausgeführt wird (natürlich mit einem gewissen vorgegeben x) und das Ergebnis in einer Variable gespeichert wird..
Also z.B. function="x*x" und x=2 -> result = x*x = 4
Die Klasse String bietet massig Funktionen zum "Auslesen" von Stringteilen etc.
Einfach mal anschauen.
Diese Stringteile kannste dann in Zahlen konvertieren und z.B. an Rechen-Funktionen übergeben.
edit: Das geht natürlich nur bei EINFACHEN Funktionen und auch nur, wenn sie immer diesselbe Struktur haben
"5*7" ist z.B. was anderes wie " 5 * 7 "
Bsp:
Code:
public class TestString {
/**
* @param args
*/
public static void main(String[] args)
{
String funktion = "5*7";
String[] teile = funktion.split("\\*");
int x = Integer.valueOf(teile[0]);
int y = Integer.valueOf(teile[1]);
System.out.println(x*y);
}
}
Entweder einen eigenen Parser/Interpreter bauen (ordentliche Implimentiereung erfordert ein paar Semester Theoinformatik, billige Formeln für Abb(R,R) lassen sich auch ohne Vorkenntnisse intuitiv parsen) oder irgendwo einen fertigen abschreiben, etwa sowas hier: JEP - Java Math Expression Parser
(da soll irgendwo eine kostenlose testversion sein).
In der Standard Java-API ist sowas nicht vorhanden, da sich die Anforderungen an solche Sachen nicht mal annähernd klar umreißen lassen: was dem einen zuviel ist, ist für den anderen eher unbrauchbarer Kinderkram...
@Verjigorm Naja, gut.... aber dann müsste ich mir ja erst eine Routine bauen, die den String zeichenweise analysiert. Zumal ja in dem String noch gar keine Zahlen drin stehen, sondern nur meine Variable, die ich später noch mit einem gewissen Wert belegen möchte.
Rein praktisch gesehen, hätte ich eben gern sowas:
double x = 2;
String function = "x*x";
double result = x*x; // also sozuagen result = function mit eingesetztem x
Ok, ich dachte nicht, dass du es wirklich SO kompliziert machen möchtest.
Wenn doch, dann bin ich der festen Überzeugung, dass der Ansatz an sich mit dem String schon falsch ist und man das anders lösen könnte/sollte.
@ Verjigorm Mh ja, bin ja noch am überlegen, wie ich es sonst machen könnte. Wie gesagt - hätte ja sein können, dass es in Java einen einfachen Befehl für sowas gibt
@ Verjigorm Mh ja, bin ja noch am überlegen, wie ich es sonst machen könnte. Wie gesagt - hätte ja sein können, dass es in Java einen einfachen Befehl für sowas gibt
Was willst du denn konkret machen? Musst du denn an irgendeiner stelle wirklich eine vom Menschen eingetippte formel interpretieren, oder soll das ganze nur ein Umweg um irgendwas sein????:L
inwiefern denn beruhigend?
ne, also, diese parser von drittanbietern sind wahrscheinlich gar nicht übel, glaube nicht, dass da einem spontan "was besseres" einfallen würde...
Ich hab's doch noch gar nicht gesehen...
Nehmen wir mal an, Formelzeichen sind grosse und kleine Buchstaben des lateinischen und griechischen Alphabets. Hinzu kommen Zeichen für Rechenoperationen (möglicherweise Kompromisse für Wurzelzeichen und Exponenten finden z.B. Tokens). Nun braucht man den String eigentlich nur Zeichen für Zeichen scannen und die Formelzeichen in einer Liste (Set) speichern. Anschliessend holt man sich für jeden Eintrag einen Double (oder meinetwegen auch Float) Wert vom Benutzer und speichert diese ebenfalls in einer Liste (Set). Anhand dieser beiden Listen lässt sich nun mit "replace(formelzeichen[x], "%$" + x + "f")" (in einer Scheife ausgeführt) und anschliessendem "String.format(formel, werteliste)" ein String erstellen, der sich mit einem StreamTokenizer (offenbar mein Lieblingsspielzeug ) welcher so konfiguriert ist, dass er Zahlen ("parseNumbers()") und Rechenoperationen auseinanderhält, parsen lässt.
der kann doch höchstens die lexikalische Analyse übernehmen, für gewöhnliche mathematische ausdrücke braucht man aber alleine wegen den Klammern schon eine kontextfreie Sprache...:noe: Kommt natürlich jetzt wirklich genau darauf an, was der OP will. Habe hier vor kurzem polynomielle Ausdrücke aus Faulheit auch nur mithilfe von regex geparst, war für den zweck gut genug^^
Sicher. Nur die lexikalische Analyse. Reicht aber aus, um die ganzen Rechenoperationen per "int" ("ttype") auseinander zu halten um per "switch" die "nval"s mathematisch zu verknüpfen.
Lol. "geht nicht" gibt's nicht bei turing-vollständigen Sprachen.
Dass es in Java in der standard API kein fertiges paket dafür gibt, haben wir ja schon gesagt.:bahnhof: