回答編集履歴
2
乗(徐)と加減のループを統合
test
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
乗
|
1
|
+
乗徐を優先するならそのように細工する必要があるでしょう。
|
2
|
+
以下のコードでは list 内で計算を進め、 pri のループで pri=0 の時に乗除、pri=1 の時に加減の計算をするようにしています。
|
2
3
|
減算も数値を負にして加算するより(どうせ if で演算子を判定するなら)そのまま引いたほうが簡単に思います。
|
3
4
|
また、 split で分解するなら、(式に問題が無ければ)正規表現を工夫することでループ等せずできます。
|
4
5
|
[先読みと後読みを使ったパターンの記述](https://www.javadrive.jp/start/regex/index15.html)
|
@@ -19,22 +20,20 @@
|
|
19
20
|
));
|
20
21
|
System.out.println("list=" + list);
|
21
22
|
|
22
|
-
//
|
23
|
+
//演算子に従って list を変化させていくことで計算を進める
|
24
|
+
for(int pri=0; pri<2; pri++) {
|
23
|
-
for(int i=1; i<list.size(); ) { //奇数番目は演算子
|
25
|
+
for(int i=1; i<list.size(); ) { //奇数番目は演算子
|
24
|
-
if(list.get(i).equals("*")) {
|
26
|
+
if(list.get(i).equals("*") && pri == 0) {
|
25
|
-
replace(list, i, getInt(list, i-1) * getInt(list, i+1));
|
27
|
+
replace(list, i, getInt(list, i-1) * getInt(list, i+1));
|
28
|
+
} else if(list.get(i).equals("/") && pri == 0) {
|
29
|
+
replace(list, i, getInt(list, i-1) / getInt(list, i+1));
|
30
|
+
} else if(list.get(i).equals("+") && pri == 1) {
|
31
|
+
replace(list, i, getInt(list, i-1) + getInt(list, i+1));
|
32
|
+
} else if(list.get(i).equals("-") && pri == 1) {
|
33
|
+
replace(list, i, getInt(list, i-1) - getInt(list, i+1));
|
26
|
-
} else {
|
34
|
+
} else {
|
27
|
-
i += 2; //次の演算子
|
35
|
+
i += 2; //次の演算子
|
28
|
-
}
|
36
|
+
}
|
29
|
-
}
|
30
|
-
//加減は後
|
31
|
-
for(int i=1; i<list.size(); ) {
|
32
|
-
if(list.get(i).equals("+")) {
|
33
|
-
replace(list, i, getInt(list, i-1) + getInt(list, i+1));
|
34
|
-
} else if(list.get(i).equals("-")) {
|
35
|
-
replace(list, i, getInt(list, i-1) - getInt(list, i+1));
|
36
|
-
} else {
|
37
|
-
i += 2;
|
38
37
|
}
|
39
38
|
}
|
40
39
|
System.out.println(list.get(0));
|
1
正規表現の簡略化
test
CHANGED
@@ -15,7 +15,7 @@
|
|
15
15
|
System.out.println("str=" + str);
|
16
16
|
|
17
17
|
List<String> list = new ArrayList<>(Arrays.asList(
|
18
|
-
str.split("(?
|
18
|
+
str.split("(?!\\d)|(?<!\\d)") //数字以外の直前もしくは数字以外の直後で分割
|
19
19
|
));
|
20
20
|
System.out.println("list=" + list);
|
21
21
|
|