質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

1回答

648閲覧

Javaで文字列の追加が上手く出来ない

ayaeri_0527

総合スコア3

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2023/01/20 05:28

前提

JavaでGUIでの電卓を作っています。
GUIでボタンが押されたら数字や計算記号を文字列に追加し,逆ポーランド記法に変換→計算という流れでプログラムを実装しようとしています。しかし,ボタンが押されてから文字列に追加する段階で意図しない出力が出てしまいます。
文字列に追加するコードは+演算子,concatメソッド,StringBuilderのappendメソッドを使いましたが全て上手くいきませんでした。
また,上記のボタンが押される→文字列に追加はどのボタンも同じアルゴリズムで書いてあるにもかかわらず,+や-はちゃんと追加されていたり,1や2は違う数字となって出力されていたり,3~8は空白で出力されたりと訳が分からなくなって困っています。
例 1+2通すと
97531+08642
と出力されます。
原因がわかる方がいればお願いします。
また,逆ポーランド変換とその計算は以下のサイトを参考にしました。
http://fantom1x.blog130.fc2.com/blog-entry-208.html

発生している問題・エラーメッセージ

GUI上のボタンが押されてから文字列に追加する段階で意図しない出力となる

該当のソースコード

Java

1package src; 2import java.awt.EventQueue; 3import java.awt.GridLayout; 4import java.awt.event.ActionEvent; 5import java.awt.event.ActionListener; 6import java.util.ArrayDeque; 7import java.util.Deque; 8import java.util.HashMap; 9import java.util.Map; 10 11import javax.swing.JButton; 12import javax.swing.JFrame; 13import javax.swing.JPanel; 14import javax.swing.JTextArea; 15 16public class Dentaku extends JFrame { 17 18 Deque<Double> que = new ArrayDeque<>(); 19 static String s=""; 20 static String ss=""; 21 static StringBuilder arr = new StringBuilder(); 22 23 private JPanel contentPane; 24 public static void main(String[] args) { 25 EventQueue.invokeLater(new Runnable() { 26 public void run() { 27 try { 28 Dentaku frame = new Dentaku(); 29 frame.setVisible(true); 30 } catch (Exception e) { 31 e.printStackTrace(); 32 } 33 } 34 }); 35 } 36 @SuppressWarnings("serial") 37 38 static Map<Character, Integer> rpnRank = new HashMap<Character, Integer>() { 39 { 40 put('(', 4); //※数値が高いほど、優先順位が高いとする 41 put('#', 3); //オペランド(数値)[キーはダミー] 42 put('*', 2); 43 put('/', 2); 44 put('+', 1); 45 put('-', 1); 46 put(')', 0); 47 } 48 }; 49 public static final int parseExpression(final String expression) { 50 final Deque<Character> stack = new ArrayDeque<Character>(); 51 final Deque<Integer> val = new ArrayDeque<Integer>(); 52 53 String s = expression.replaceAll("\\s+", ""); //空白文字を取り除く 54 s = "(" + s + ")"; //末尾に")"を付けることで、最後にスタックを吐き出させる 55 final int len = s.length(); 56 57 String tmp = ""; 58 for (int i = 0; i < len; i++) { 59 char c = s.charAt(i); 60 if ('0' <= c && c <= '9') { 61 tmp += c; //数字1文字ずつのため 62 } else { 63 if (!tmp.equals("")) { 64 val.push(Integer.parseInt(tmp)); 65 tmp = ""; 66 } 67 68 while (!stack.isEmpty() && rpnRank.get(stack.peek()) >= rpnRank.get(c) && stack.peek() != '(') { 69 char e = stack.pop(); 70 int a = val.pop(); 71 int b = val.pop(); 72 if (e == '*') { 73 val.push(b * a); 74 } else if (e == '/') { 75 val.push(b / a); //div/0 に注意 76 } else if (e == '+') { 77 val.push(b + a); 78 } else if (e == '-') { 79 val.push(b - a); 80 } 81 } 82 if (c == ')') { 83 stack.pop(); //'(' 84 } else { 85 stack.push(c); 86 } 87 } 88 } 89 90 return val.pop(); 91 } 92 93 94 public Dentaku() { 95 96 //GUI表示を行うためのおまじない 97 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 98 setBounds(100, 100, 450, 300); 99 contentPane = new JPanel(); 100 //contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 101 contentPane.setLayout(new GridLayout(5, 4)); 102 setContentPane(contentPane); 103 //String s =""; 104 105 106 JButton btn_1 = new JButton("1"); 107 btn_1.addActionListener(new ActionListener() { 108 public void actionPerformed(ActionEvent e) { 109 arr.append("1"); 110 s=s + "1"; 111 ss.concat("1"); 112 } 113 114 }); 115 contentPane.add(btn_1); 116 117 JButton btn_2 = new JButton("2"); 118 btn_2.addActionListener(new ActionListener() { 119 public void actionPerformed(ActionEvent e) { 120 arr.append("2"); 121 s=s + "2"; 122 ss.concat("2"); 123 } 124 }); 125 contentPane.add(btn_2); 126 127 JButton btn_3 = new JButton("3"); 128 btn_1.addActionListener(new ActionListener() { 129 public void actionPerformed(ActionEvent e) { 130 arr.append("3"); 131 s=s + "3"; 132 ss.concat("3"); 133 } 134 }); 135 contentPane.add(btn_3); 136 137 JButton btn_4 = new JButton("4"); 138 btn_2.addActionListener(new ActionListener() { 139 public void actionPerformed(ActionEvent e) { 140 arr.append("4"); 141 s=s + "4 "; 142 ss.concat("4"); 143 } 144 }); 145 contentPane.add(btn_4); 146 147 JButton btn_5 = new JButton("5"); 148 btn_1.addActionListener(new ActionListener() { 149 public void actionPerformed(ActionEvent e) { 150 arr.append("5"); 151 s=s + "5"; 152 ss.concat("5"); 153 } 154 }); 155 contentPane.add(btn_5); 156 157 JButton btn_6 = new JButton("6"); 158 btn_2.addActionListener(new ActionListener() { 159 public void actionPerformed(ActionEvent e) { 160 arr.append("6"); 161 s=s + "6"; 162 ss.concat("6"); 163 } 164 }); 165 contentPane.add(btn_6); 166 167 JButton btn_7 = new JButton("7"); 168 btn_1.addActionListener(new ActionListener() { 169 public void actionPerformed(ActionEvent e) { 170 arr.append("7"); 171 s=s + "7"; 172 ss.concat("7"); 173 } 174 }); 175 contentPane.add(btn_7); 176 177 JButton btn_8 = new JButton("8"); 178 btn_2.addActionListener(new ActionListener() { 179 public void actionPerformed(ActionEvent e) { 180 arr.append("8"); 181 s=s + "8"; 182 ss.concat("8"); 183 } 184 }); 185 contentPane.add(btn_8); 186 187 JButton btn_9 = new JButton("9"); 188 btn_1.addActionListener(new ActionListener() { 189 public void actionPerformed(ActionEvent e) { 190 arr.append("9"); 191 s=s + "9"; 192 ss.concat("9"); 193 } 194 }); 195 contentPane.add(btn_9); 196 197 JButton btn_0 = new JButton("0"); 198 btn_2.addActionListener(new ActionListener() { 199 public void actionPerformed(ActionEvent e) { 200 arr.append("0"); 201 s=s + "0"; 202 ss.concat("0"); 203 } 204 }); 205 contentPane.add(btn_0); 206 207 JButton btn_plus = new JButton("+"); 208 btn_plus.addActionListener(new ActionListener() { 209 public void actionPerformed(ActionEvent e) { 210 arr.append("+"); 211 s=s + "+"; 212 ss.concat("+"); 213 } 214 215 }); 216 contentPane.add(btn_plus); 217 218 JButton btn_mainasu = new JButton("-"); 219 btn_mainasu.addActionListener(new ActionListener() { 220 public void actionPerformed(ActionEvent e) { 221 arr.append("-"); 222 s=s + "-"; 223 ss.concat("-"); 224 } 225 }); 226 contentPane.add(btn_mainasu); 227 228 229 230 JButton btn_kakeru = new JButton("*"); 231 btn_kakeru.addActionListener(new ActionListener() { 232 public void actionPerformed(ActionEvent e) { 233 arr.append("*"); 234 s=s + "*"; 235 ss.concat("*"); 236 } 237 }); 238 contentPane.add(btn_kakeru); 239 240 JButton btn_per = new JButton("÷"); 241 btn_per.addActionListener(new ActionListener() { 242 public void actionPerformed(ActionEvent e) { 243 arr.append("/"); 244 s=s + "/"; 245 ss.concat("/"); 246 } 247 }); 248 contentPane.add(btn_per); 249 250 251 252 253 JButton btn_equal = new JButton("="); 254 btn_equal.addActionListener(new ActionListener() { 255 public void actionPerformed(ActionEvent e) { 256 String sss=arr.toString(); 257 System.out.println(s); 258 System.out.println(ss); 259 System.out.println(sss); 260 } 261 262 263 }); 264 contentPane.add(btn_equal); 265 266 267 JButton btn_AC = new JButton("AC"); 268 btn_AC.addActionListener(new ActionListener() { 269 public void actionPerformed(ActionEvent e) { 270 s = ""; 271 que = null; 272 273 } 274 }); 275 contentPane.add(btn_AC); 276 277 278 //String str=arr.toString(); 279 String str="あいうえお"; 280 JTextArea text = new JTextArea(str); 281 contentPane.add(text); 282 text.setLineWrap(true); 283 getContentPane().add(text); 284 285 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 286 setSize(530, 200); 287 setVisible(true); 288 289 290 291 292 293 } 294 295} 296

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2023/01/20 06:10

ayaeri_0527さんはaiue_minamiさんとどういうご関係ですか? 文体も参考コード以外の部分もそっくりです。 [JavaでNoSuchElementExceptionが出てしまう](https://teratail.com/questions/dcculntsr1krad) どういう使い分けか知りませんが、同一人物ですよね? 複数IDの利用は「利用規約」違反です。 > 利用規約 > 第7条(禁止事項) > (11) 複数のユーザーIDを1人で保有する行為 [teratail【テラテイル】|利用規約](https://teratail.com/legal)
guest

回答1

0

java

1JButton btn_3 = new JButton("3"); 2btn_1.addActionListener(new ActionListener() { // btn_1 ?

のような間違いが山ほどあります。

投稿2023/01/20 05:34

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問