Java: Rechenoperatoren und Zahlen in einem String --> Ergebnis ausrechnen

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!

Lrott  12.07.2012, 17:15
  1. Was bringt es wenn man in die Lösung vorkaut
  2. ist die Methode unlustig, da du javascript impotierst...
0
gast987 
Fragesteller
 12.07.2012, 17:16

Vielen Dank! Ich hatte auch schon stundenlang bei Google gesucht, aber auf diese Seite bin ich noch nicht gestoßen. Hat sofort funktioniert!

0

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.

gast987 
Fragesteller
 12.07.2012, 17:03

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).

0
Lrott  12.07.2012, 17:11
@gast987

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.

0
Delden  12.07.2012, 17:12
@gast987

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.

0
Lrott  12.07.2012, 17:18
@Delden

Also ich weiß nicht was für nen Splitstring du verwendest, und wie du auf die Idee kommst es in ein Array zustecken, aber wenn ich mir so ansehe was du da schreibst, wundert es mich nicht dass du es konfus findest

0
Japana  13.07.2012, 09:17
@Lrott

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...

0
Lrott  13.07.2012, 11:11
@Japana

:-) Macht der Taschenrechner ja auch so ;-)

0

Rekursion und String auseinander basteln.