Sto cercando di scrivere una funzione di valutazione String cioèfunzione di valutazione di scrittura String
evaluate("4 + 1") ; // returns 5
evaluate("4 + 1 + 3") ; // returns 8
evaluate("4 + 1 * 3") ; // returns 7 (not 15)
The operators are + -/and *
mio iniziale anche se era di usare le espressioni regolari per raccogliere gli operatori e le cifre come queste può essere abbinato. E che dopo aver trovato tali informazioni, in qualche modo capire un modo per dare la priorità agli operatori /*
ove -+
.
Ecco come ho iniziato:
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;
}
adesso posso scrivere un altro metodo per estrarre le cifre utilizzando la stessa logica.
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;
}
Ora è la parte in cui sono bloccato. # 1 Questo metodo precedente non riesce al terzo esempio:
evaluate("4 + 1 * 3") ; // returns 7 (not 15)
E questo # 2 Anche se provo esempi precedenti, non riesco a capire come metterli nel giusto ordine.
Sono sulla buona strada, qualcuno ha qualche consiglio utile per favore condividere?
Questo è un [precedenza degli operatori] (http: // en.wikipedia.org/wiki/Order_of_operations) problema. In un parser di discesa ricorsivo, si scende dagli operatori di precedenza inferiore alle precedenze superiori e si utilizza l'operatore parentetico per tornare all'inizio. –
Spero che questo aiuti: http://en.wikipedia.org/wiki/Recursive_descent_parser – sarnold
l'espressione 'evaluate (" 4 + 1 * 3 ");' DOVREBBE restituire 7.se vuoi che ritorni 15 dovresti aver scritto 'evaluate (" (4 + 1) * 3 "); ' – alfasin