2

Javaでユーザー指定の式を計算する方法.

例: 指定された exp が 3*4+(5*6) の場合、これを計算する方法。誰でも私を助けることができます。

4

4 に答える 4

4

簡単なグーグルの後にこのコードを見つけました:

import java.util.Stack;

/**
 * Class to evaluate infix and postfix expressions.
 * 
 * @author Paul E. Davis (feedback@willcode4beer.com)
 */
public class InfixPostfixEvaluator {

        /**
         * Operators in reverse order of precedence.
         */
        private static final String operators = "-+/*";
        private static final String operands = "0123456789";

        public int evalInfix(String infix) {
                return evaluatePostfix(convert2Postfix(infix));
        }

        public String convert2Postfix(String infixExpr) {
                char[] chars = infixExpr.toCharArray();
                Stack<Character> stack = new Stack<Character>();
                StringBuilder out = new StringBuilder(infixExpr.length());

                for (char c : chars) {
                        if (isOperator(c)) {
                                while (!stack.isEmpty() && stack.peek() != '(') {
                                        if (operatorGreaterOrEqual(stack.peek(), c)) {
                                                out.append(stack.pop());
                                        } else {
                                                break;
                                        }
                                }
                                stack.push(c);
                        } else if (c == '(') {
                                stack.push(c);
                        } else if (c == ')') {
                                while (!stack.isEmpty() && stack.peek() != '(') {
                                        out.append(stack.pop());
                                }
                                if (!stack.isEmpty()) {
                                        stack.pop();
                                }
                        } else if (isOperand(c)) {
                                out.append(c);
                        }
                }
                while (!stack.empty()) {
                        out.append(stack.pop());
                }
                return out.toString();
        }

        public int evaluatePostfix(String postfixExpr) {
                char[] chars = postfixExpr.toCharArray();
                Stack<Integer> stack = new Stack<Integer>();
                for (char c : chars) {
                        if (isOperand(c)) {
                                stack.push(c - '0'); // convert char to int val
                        } else if (isOperator(c)) {
                                int op1 = stack.pop();
                                int op2 = stack.pop();
                                int result;
                                switch (c) {
                                case '*':
                                        result = op1 * op2;
                                        stack.push(result);
                                        break;
                                case '/':
                                        result = op2 / op1;
                                        stack.push(result);
                                        break;
                                case '+':
                                        result = op1 + op2;
                                        stack.push(result);
                                        break;
                                case '-':
                                        result = op2 - op1;
                                        stack.push(result);
                                        break;
                                }
                        }
                }
                return stack.pop();
        }
        private int getPrecedence(char operator) {
                int ret = 0;
                if (operator == '-' || operator == '+') {
                        ret = 1;
                } else if (operator == '*' || operator == '/') {
                        ret = 2;
                }
                return ret;
        }
        private boolean operatorGreaterOrEqual(char op1, char op2) {
                return getPrecedence(op1) >= getPrecedence(op2);
        }

        private boolean isOperator(char val) {
                return operators.indexOf(val) >= 0;
        }

        private boolean isOperand(char val) {
                return operands.indexOf(val) >= 0;
        }

}

から: http://willcode4beer.com/design.jsp?set=evalInfix

于 2011-08-25T05:39:19.527 に答える
2

Javaはすでにこれを行っています。何もダウンロードする必要はありません。

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
public class EvaluationExample {
    public static void main(String[] args) throws Exception{
        System.out.println(new ScriptEngineManager().getEngineByName("JavaScript").eval("3*4+(5*6)"));
    } 
}

(これは、Javaでスクリプトを使用する方法を示す最初のSOの回答ではありません。このページを見ている人がリンクをたどらない場合にのみ、ここに追加しました。構文解析は楽しく、勉強する価値がありますが、必要な場合はユーザー提供の式を評価し、スクリプトを使用します。)

更新OPは接尾辞評価ソリューションを探しています。これは2つのステップで実行する必要があります。最初に入力文字列を後置記法に変換し、次に後置「コード」を(おそらくスタックベースのエバリュエーター)を介して実行します。これについては、PaulPROの回答を参照してください。JavaCCまたは別のパーサジェネレータを使用する場合は、受け入れる文字列をより柔軟に使用できるため、改行やその他の空白を使用できます。

于 2011-08-25T05:49:21.550 に答える
2

Java Expression evaluator をご覧ください: http://java.net/projects/eval/pages/Home

于 2011-08-25T05:41:37.613 に答える
0

ここにスポイラーがあります (Java での数学式の解析)。

于 2011-08-25T05:41:26.607 に答える