Запись функции оценки строки

Я пытаюсь написать функцию оценки String, т.е.

evaluate("4 + 1") ; // returns 5 
evaluate("4 + 1 + 3") ; // returns 8 
evaluate("4 + 1 * 3") ; // returns 7 (not 15) 

The operators are + - / and *

Сначала я использовал регулярные выражения для сбора операторов и цифр, поскольку они могут быть сопоставлены. А затем, найдя эту информацию, каким-то образом найти способ расставить приоритеты /*над -+операторами.

Вот как я начал:

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 Даже если я попробую предыдущие примеры, я не могу понять, как расположить их в правильном порядке.

Я на правильном пути вообще, кто-нибудь может дать какой-нибудь полезный совет, пожалуйста, поделитесь?

5
задан Mike Samuel 2 July 2012 в 22:48
поделиться