回答編集履歴

2

乗(徐)と加減のループを統合

2023/05/11 18:09

投稿

jimbe
jimbe

スコア12648

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

正規表現の簡略化

2023/05/10 10:09

投稿

jimbe
jimbe

スコア12648

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("(?<=\\d)(?!\\d)|(?<!\\d)(?=\\d)") //数字と数字以外のもしくは数字以外と数字で分割
18
+ str.split("(?!\\d)|(?<!\\d)") //数字以外の直前もしくは数字以外の直後で分割
19
19
  ));
20
20
  System.out.println("list=" + list);
21
21