外部ライブラリ「beanshell」の Interpreter.eval() というメソッドを使用しています。これにより、文字列を使用して数学演算を行い、解を返すことができます。
正常に動作しますが、2 乗したい場合、またはこれから平方根を取得したい場合は、元の文字列を次のように変更する必要があります。
文字列 st ="x = 2+4*a*(b+c)^2"
"(b+c)^2"を"(b+c)*(b+c)"または"Math.pow((b+c),2)"に置き換えるには、括弧の間の文字を取得する必要があります。
これどうやってするの?前もって感謝します!
- - 編集 - -
最後に、解決策を見つけました。
Interpreter interpreter = new Interpreter();
String st = "x = 2+4*1*(2*(1+1)^2)^2 + (4+5)^2";
int index = -2;
char prev;
char post;
int openPar = -1;
if (st.contains("^")) {
index = st.indexOf("^");
while (index != -1) {
prev = st.charAt(index - 1);
post = st.charAt(index + 1);
if (prev == ')') {
int match = 0;
int i = index - 2;
char check = '0';
boolean contiunar = true;
while (contiunar) {
check = st.charAt(i);
if (check == ')')
match++;
if (check == '(') {
if (match == 0) {
openPar = i;
contiunar = false;
} else
match = match - 1;
}
i = i - 1;
}
String rep = st.substring(openPar + 1, index - 1);
String resultado = "";
try {
interpreter.eval("r= Math.pow(" + rep + "," + post
+ ")");
resultado = interpreter.get("r").toString();
} catch (EvalError e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
st = st.replace("(" + rep + ")^" + post, resultado);
} else {
st = st.replace(prev + "^" + post, prev + "*" + prev);
}
index = st.indexOf("^");
}
}
これで、元の文字列x = 2+4*1*(2*(1+1)^2)^2+(4+5)^2を変更 しました (たとえば)
x=2+4*1*64+81に
- 最初に最初の「^」を検索します
- 前の文字を取得する
- ")" がある場合
- 前の文字を検索しながら "(" を検索しますが、"(" の前に ")" を検索する場合は、2 つの "(" を見つける必要があります。
これは "(2+(3+4)+5)^2" の場合です ---> "3+4)+5" の代わりに "2+(3+4)+5" を返します。
ここで正しい式Math.pow("result","2")" に置き換え、ステップごとに計算します (1+1)^2 = 4 (2*4)^2 = 64
(4+5)^2 = 81
最後に、Interpreter.eval() で戻り値を計算できるようになりました。
答えてくれてありがとう!