私は文字列の評価関数を記述しようとしてすなわち書き込み文字列の評価関数
evaluate("4 + 1") ; // returns 5
evaluate("4 + 1 + 3") ; // returns 8
evaluate("4 + 1 * 3") ; // returns 7 (not 15)
The operators are + -/and *
私の最初は、しかし、これらは一致させることができるよう事業者と数字を収集するために正規表現を使用することでした。そして、その情報を見つけた後に、何らかの理由で優先順位をつける方法を見つけ出す/*
ove -+
オペレータ。ここで
は、私が始めた方法です:
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;
}
今、私は同じロジックを使用して数字を抽出するための別の方法を書くことができます。
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;
}
今は私が立ち往生している部分です。 #1は、この上記の方法は、第三の例で失敗:私は前の例を試す場合でも、私は、正しい順序でそれらを置くためにどのようにそれを
evaluate("4 + 1 * 3") ; // returns 7 (not 15)
そして、この第2位把握することはできません。
全く正しい軌道上アム私は、誰もがいくつかの有用なアドバイスを共有してくださいがありますか?
これは、[演算子の優先順位](ですhttp:// en.wikipedia.org/wiki/Order_of_operations)の問題です。再帰的降下パーサでは、優先順位の低い演算子から優先順位の高いものに降下し、かっこ演算子を使用して先頭にジャンプします。 –
私はこれが役に立てば幸い:http://en.wikipedia.org/wiki/Recursive_descent_parser – sarnold
式は '( "+ 1 4 * 3")を評価;' 7を返すべきです。あなたが15を返すことを望むなら、 'evaluate("(4 + 1)* 3 ")と書くべきです。 ' – alfasin