Java: Rechenoperatoren und Zahlen in einem String --> Ergebnis ausrechnen
Hallo zusammen,
bei einem Java-Projekt, das ich seit einigen Tagen programmiere, stehe ich nun kurz vor der Vollendung. Es fehlt aber noch ein kleiner letzter Schritt. Und zwar habe ich einen String, in dem eine komplizierte Rechnung (bestehend aus + - * / und Klammern) steht. Ich möchte nun das Ergebnis dieser Rechnung ausgeben. Leider kann ich es nicht einfach hintereinander (von links nach rechts) rechnen, da ja Klammern und Punkt vor Strich beachtet werden müssen. Könnt ihr mir da helfen?
Also, theoretisch ist folgendes möglich:
rechnung = 1234+56.78*23/(139-827)+745*12-6
ergebnis = ???
Wie gesagt, rechnung ist ein String und ergebnis ist ein double. Das Ergebnis müsste bei diesem Beispiel am Ende 10166.10183 sein.
Vielen Dank im Voraus für eure Hilfe!
4 Antworten
Diese Lösung ist nicht von mir, sondern von der Seite http://codekicker.de/fragen/Komplexen-Term-berechnen/313 kopiert!
Die Antwort wurde von "Marco13" gepostet!
import javax.script.*;
...
...
...
String rechnung = "1234+56.78*23/(139-827)+745*12-6";
...
...
...
public static double evaluate(String string)
{
ScriptEngine engine =
new ScriptEngineManager().getEngineByName("JavaScript");
try
{
Object object = engine.eval("eval("+string+")");
if ((object != null) && (object instanceof Number))
{
return ((Number)(object)).doubleValue();
}
else
{
throw new IllegalArgumentException(
"Invalid input: '"+string+"'");
}
}
catch (ScriptException e)
{
throw new IllegalArgumentException(
"Invalid input: '"+string+"'", e);
}
}
public double ergebnis(){
return evaluate(rechnung);
}
Achtung: nicht auf Sicherheitslücken, Kompatibilität usw. geprüft. Verwendung auf eigene Gefahr!
Vielen Dank! Ich hatte auch schon stundenlang bei Google gesucht, aber auf diese Seite bin ich noch nicht gestoßen. Hat sofort funktioniert!
- Was bringt es wenn man in die Lösung vorkaut
- ist die Methode unlustig, da du javascript impotierst...
Viel Spaß mit split http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#split%28java.lang.String%29
Einfach die das Teil zerlegen und entsprechend umsetzen.
Sind doch nur 5 Cases + - / * "()",
Mit nen bisschen nachdenken wirste auch auf ne fixe lösung kommen, wie zB den inhalt von Klammer reku... fast hätt ichs verraten auszurechnen und dannach halt entsprechend den rest nach und nach anzugehen...
Der Gag am Programmieren ist ja nicht, dass jemand dir die Lösung verrät sondern, dass du selbst drauf kommst und dein gelerntest in Transferaufgaben anwendest...
Das größte Problem sind hier nur die Klammern.
Das ganze Konzept scheint mir schon etwas konfus, aber dafür scheint es schon zu spät zu sein.
Man könnte aus dem Split-Ergebnis eine ArrayList oder ähnliches füllen und dann durchlaufen. Sobald eine Klammer gefunden wird, kann man das Ergebnis berechnen und wieder ins verkleinerte Array bringen. Methode berechne Arraylist (Arraylist);
[1234] [+] [56.78] [] [23] [/] [(] [139] [-] [827] [)] [+] [745][][12][-][6]
Aufruf Methode
[1234] [+] [56.78] [] [23] [/] [-688] [+] [745][][12][-][6]
Rückgabe erste Berechnung
Dann wieder Aufruf der Methode bis Arraylist.size = 1.
Rekursion und Split sind schon richtig. Du musst nur bei den Klammern aufpassen. Theoretisch wären ja auch verschachtelte Klammern möglich. Also sowas 2+10((10-5)2). Also erst genau alle Klammern lösen. Bei der Rekursion musst Du Dir um verschachtelte Arrays auch keinen Kopf machen, weil du ja in deiner Funktion immer nur Teile der Rechnung löst...
Hier gibt's einige Vorschläge zu diesem Thema:
Rekursion und String auseinander basteln.
Daran hatte ich auch schon gedacht, aber wie kann ich dann mit den Operatoren rechnen? Ich kann ja nicht alle cases abfragen, weil die sich dann ja ineinander verschachteln (wie gesagt, man kann nicht von links nach rechts rechnen).