Ich versuche, eine String Bewertungsfunktion heißtSchreiben String Bewertungsfunktion
evaluate("4 + 1") ; // returns 5
evaluate("4 + 1 + 3") ; // returns 8
evaluate("4 + 1 * 3") ; // returns 7 (not 15)
The operators are + -/and *
Meine anfängliche obwohl reguläre Ausdrücke zu verwenden war zu schreiben, Operatoren und Ziffern, da diese sammeln können angepasst werden. Und dann, nachdem Sie diese Informationen gefunden haben, finden Sie irgendwie eine Möglichkeit, /*
Ove -+
Betreiber zu priorisieren.
Hier ist, wie ich begann:
static String regex = "([\\+\\*-/])+";
static String digitRegex = "(\\d)+";
public static void main(String[] args) {
System.out.println(getOperators("4 + 1 * 3"));
}
public static List<String> getOperators(String input) {
Pattern p = Pattern.compile(regex);
Matcher matcher = p.matcher(input);
List<String> operatorList = new ArrayList<String>();
int count = 0;
while (matcher.find()){
if (matcher.group(count) != null && matcher.group(count).trim().length() > 0) {
operatorList.add(matcher.group(count));
count++;
}
}
return operatorList;
}
Jetzt kann ich eine andere Methode schreibt die Ziffern mit der gleichen Logik zu extrahieren.
public static List<Integer> getDigits(String input) {
Pattern p = Pattern.compile(digitRegex);
Matcher matcher = p.matcher(input);
List<Integer> digitList = new ArrayList<Integer>();
int count = 0;
while (matcher.find()) {
if (matcher.group(count) != null && matcher.group(count).trim().length() > 0) {
digitList.add(Integer.valueOf(matcher.group(count)));
count++;
}
}
return digitList;
}
Jetzt ist der Teil, wo ich feststecke. # 1 Dieses obige Verfahren nicht auf dem dritte Beispiel:
evaluate("4 + 1 * 3") ; // returns 7 (not 15)
Und das # 2 Auch wenn ich die vorherigen Beispiele versuchen, ich kann es nicht herausgefunden, wie man sich in der richtigen Reihenfolge zu setzen.
Bin ich überhaupt auf dem richtigen Weg, hat jemand einen nützlichen Ratschlag, bitte teilen?
Dies ist eine [Operator Vorrang] (http: // en.wikipedia.org/wiki/Order_of_Operations) Problem. In einem rekursiven Descent-Parser steigen Sie einfach von niedrigeren Vorrangoperatoren zu höheren Präzedenzfällen ab und verwenden den Operator in Klammern, um zurück zum Anfang zu springen. –
Ich hoffe, das hilft: http://en.wikipedia.org/wiki/Recursive_descent_parser – sarnold
der Ausdruck 'evaluate (" 4 + 1 * 3 ");' SOLLTE zurück 7.Wenn du möchtest, dass es 15 zurückgibt, solltest du "evaluate (" (4 + 1) * 3 ") geschrieben haben; ' – alfasin