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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

2回答

2339閲覧

数値を保持する配列を作りたい

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2020/09/27 00:48

Javaで電卓を作成してます。
下のパネル(txt2)に数値を入力し、上のパネル(txt1)に式を出力しようとしています。
txt2に出力された数値が演算子が入力されたらstrArrayに格納し、strArrayに格納されたものをtxt1に出力されるようにしたいのですが、書き方がわからず詰まってしまっていう状態です。
こちらが動くような記述を教えていただけませんでしょうか。

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

書き方がわかりません。

該当のソースコード

Java

1import java.awt.BorderLayout; 2import java.awt.Dimension; 3import java.awt.Font; 4import java.awt.GridLayout; 5import java.awt.event.ActionEvent; 6import java.awt.event.ActionListener; 7import java.util.ArrayList; 8 9import javax.swing.JButton; 10import javax.swing.JFrame; 11import javax.swing.JPanel; 12import javax.swing.JTextField; 13 14public class Calc { 15 16 /*フレームを作る*/ 17 private static void createAndShowGUI() { 18 19 20 /*JFrameオブジェクトを生成する*/ 21 JFrame frame = new JFrame("CalcMain"); 22 23 /*ウィンドウを閉じるとプログラムが終了する*/ 24 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 25 26 MyPanel h = new MyPanel(); 27 28 /*フレームにオブジェクトを置く*/ 29 frame.add(h, BorderLayout.CENTER); 30 /*フレームを必要最小の大きさにする*/ 31 frame.pack(); 32 /*最小サイズを指定 1.6以上で有効*/ 33 frame.setMinimumSize(new Dimension(frame.getSize().width, frame.getSize().height)); 34 /*フレームを表示する*/ 35 frame.setVisible(true); 36 37 38 } 39 40 /*mainメソッド、電卓組み立てる*/ 41 public static void main(final String[] args) { 42 javax.swing.SwingUtilities.invokeLater(new Runnable() { 43 public void run() { 44 createAndShowGUI(); 45 } 46 }); 47 } 48} 49 50 51/*JPanelを継承したメソッド*/ 52class MyPanel extends JPanel implements ActionListener { 53 54 /*数値出力する画面定義*/ 55 JTextField txt1, txt2 ,txt0; 56 /*追加できる配列(できた数値などを追加していく)*/ 57 ArrayList<String> sHis = new ArrayList<String>(); 58 int iCnt = 0; 59 60 ArrayList<String> strArray = new ArrayList<String>(); 61 String s1 = ""; 62 63 64 65 /*ボタン追加*/ 66 JButton[] aBtn = new JButton[24]; 67 /*ボタンに表示*/ 68 String [] sBtD = { 69 "7","8","9","/","←","±", 70 "4","5","6","*","CE","tax", 71 "1","2","3","−","C","%", 72 "0","00","000","+","=","." 73 }; 74 75 /*画面に出力される*/ 76 String [] sBtO = { 77 "7","8","9","/","","*-1", 78 "4","5","6","*","","*1.1", 79 "1","2","3","-","","*0.01", 80 "0","00","000","+","",".", 81 }; 82 83 public MyPanel() { 84 85 /*txt1の設定 ※上の画面*/ 86 /*表示は15桁*/ 87 txt1 = new JTextField(15); 88 /*txt1にアクションを呼び出す*/ 89 txt1.addActionListener(this); 90 /*フォントを指定する*/ 91 txt1.setFont(new Font("SansSerif",Font.PLAIN,16)); 92 93 /*txt2の設定 ※下の画面*/ 94 /*表示は15桁*/ 95 txt2 = new JTextField(15); 96 /*フォントを指定する*/ 97 txt2.setFont(new Font("SansSerif",Font.ITALIC,16)); 98 /*表示を右側にする*/ 99 txt2.setHorizontalAlignment(JTextField.RIGHT); 100 101 txt0 = new JTextField(15); 102 103 /*くりかえし*/ 104 for(int i = 0; i< aBtn.length; i++) 105 aBtn[i] = new JButton(sBtD[i]); 106 /*aBtn(ボタン)を押したときにおきるアクションを呼び出す*/ 107 for(JButton b : aBtn) 108 b.addActionListener(this); 109 110 /*パネルのレイアウト*/ 111 /*式と答えを表示するパネルの定義*/ 112 JPanel pa = new JPanel(); 113 114 pa.setLayout(new GridLayout(2,1)); 115 116 pa.add(txt1); 117 pa.add(txt2); 118 119 /*パネルの定義*/ 120 /*ボタンを表示するパネルの定義*/ 121 JPanel pc = new JPanel(); 122 pc.setLayout(new GridLayout(4,6)); 123 /*aBtn(表示)をボタンに追加する*/ 124 for(JButton b : aBtn) 125 pc.add(b); 126 127 /*パネル(ボタン)をどこに配置するか*/ 128 setLayout(new BorderLayout(2,2)); 129 /*式と答え表示するパネルは真ん中*/ 130 add(pa, BorderLayout.CENTER); 131 /*ボタンは下*/ 132 add(pc, BorderLayout.SOUTH); 133 134 } 135 136 137 /*ボタンを押したときのアクション*/ 138 public void actionPerformed(ActionEvent e) { 139 140 141 String[] array = strArray.toArray(new String[strArray.size()]); 142 /*txt1に値を代入*/ 143 for (int m =0; m<15; m++) { 144 145 146 147 148 /*もし演算子が押されたら箱に詰めていく*/ 149 if(e.getSource()==aBtn[3]|| e.getSource()==aBtn[9]||e.getSource()==aBtn[15]||e.getSource()==aBtn[21]||e.getSource()==aBtn[22]) { 150 151 /*エラー*/ 152 /*わからない部分*/ 153 String str1 = sHis.getText(); 154 strArray.add(sHis.getText()); 155 strArray = strar.setText(strar.getText()); 156 strArray.add(sHis.getText(aBtn[m])); 157 txt1.setText(strArray.getText()); 158 159 strar[m] = strArray.setText(strArray.getText(sHis)); 160 161 162 163 }else if(e.getSource()==aBtn[10]) { 164 /*CEボタンを押したら*/ 165 /*最後の箱を消す*/s1 = strArray.get(strArray.size()-1); 166 txt1.setText(s1); 167 } 168 169 } 170 171 172 /*数字以外のボタンを押したときにする動き*/ 173 if (e.getSource()==aBtn[16]) { //★Cボタンを押したら 174 /*txt1とtxt2にあるもの全てを消す*/ 175 txt1.setText(""); txt2.setText(""); 176 177 } else if(e.getSource()==aBtn[4]) { //バックスペースキー(←)を押したら 178 String s = txt2.getText(); 179 int length = s.length(); 180 /*1文字以上入力されているか*/ 181 if( length > 0 ){ 182 /*1文字削除する*/ 183 s = s.substring(0, length-1); 184 /*1文字削除されて0だけ残ったら、それも削除する。*/ 185 if( s.equals("0") ) 186 s = ""; 187 txt2.setText(s); 188 } 189 190 } 191 192 193 194 195 /*もし=ボタンが押されたら*/ 196 if(e.getSource()==aBtn[22]) { 197 String s = txt2.getText(); 198 sHis.add(s); 199 iCnt = sHis.size()-1; 200 /*txt2に計算結果を出す、ゲットする*/ 201 txt2.setText(CalcMain.sEval(s)); 202 203 String str = txt2.getText(); 204 int length = str.length(); 205 /*1文字以上入力されているか*/ 206 if( length >= 0 ){ 207 208 209 /*1文字削除する*/ 210 str = str.substring(0, length-1); 211 212 } 213 } 214 215 216 217 /*パネルに追加する、文字を続けて打ち込む繰り返し*/ 218 for(int i = 0; i< aBtn.length; i++) 219 220 /*もしaBtnの何かが押されたら*/ 221 if(e.getSource()==aBtn[i]) 222 /*txt2に追加していく*/ 223 txt2.setText(txt2.getText()+sBtO[i]); 224 225 /*カーソルをあてる*/ 226 txt2.requestFocus(); 227 228 } 229} 230 231

Java

1import javax.script.ScriptEngine; 2import javax.script.ScriptEngineManager; 3 4class CalcMain { // JsCalc.java [java] 5 static ScriptEngineManager factory = new ScriptEngineManager(); 6 static ScriptEngine engine = factory.getEngineByName("JavaScript"); 7 8 // JavaでJavaScriptのeval()関数を呼び出す 9 static String sEval(String sExpr) { 10 String sScript="with(Math){"+sExpr+"}"; // 「Math.」を省略可能にするため 11 try{ 12 return( engine.eval(sScript).toString() ); 13 } 14 catch(NullPointerException e){ // 関数定義でエラー防止 15 return(sExpr); 16 } 17 catch(Exception e){ 18 return("error: "+e); 19 } 20 } 21 22 public static void main(String[] args) { 23 24 } 25} 26 27 28

試したこと

いろんなサイトを見て記述を試したのですが、動くような記述ができません。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

Zuishin

2020/09/27 00:55

前の質問が未解決のようですが、同時進行しても大丈夫な質問ですか? 二つの質問が相互依存するようだと回答が大変難しくなります。
退会済みユーザー

退会済みユーザー

2020/09/27 01:06

前の質問のものはこちらが実装されないと動かないと思っています。 この質問→配列に数値を格納 前の質問→上記の配列に格納された数値を削除
Zuishin

2020/09/27 01:12

ならば前の質問を編集し、前提となる質問を新しく建てたことを後ろに追記した上で、回答者たちに可能ならこちらに先に回答するようお願いしてください。 そうでなければ、質問に回答する際に必要な前提が前の質問に書かれていないことになり、この質問を知らない回答者たちが後で不愉快な思いをすることになります。
退会済みユーザー

退会済みユーザー

2020/09/27 01:21

かしこまりました。 ご指摘いただきありがとうございます。
guest

回答2

0

まず、大前提として、 sHis などの java.util.ArrayList には getText() というメソッドはありません。
少なくともこの点を修正しないとコンパイルできないので動きがどうこういう以前の問題です。

次に、演算子が押された時に sHis.getText() を呼び出していますが、この時点で sHis は空っぽのはずです。なぜなら = が押された時にしか sHis.add(s) を実行していないからです。
電卓の使い方としては、 最初に数字(例えば123)を入れ、次に演算子(例えば *)、そしてまた数字(例えば456) と、進むはずで、この過程では = は押していません。そのため、演算子(この流れにおいての*)を入れた時点では、 sHis には new ArrayList<String>() した後何も追加されていないのです。
そのため、例え sHis.getText() が動いたとしても、値は何も取り出せず strArray に設定されるのはせいぜい空文字列でしかないことになります。

さて、問題は、 sHisstrArraytxt1txt2 の使い方にあります。
sHis は正直いうと不要な変数でしょう。 strArray だけでおそらく十分です。

段取りだけ言うと、txt2 に入力された数字を、演算子が入力された時点で、 strArray.add(txt2の文字列) のようにし、入力された演算子も別途 strArray.add(今入れられた演算子) する。(txt2からの取り出しや消去、演算子の文字列判定などは割愛していますのて適宜実行してください)
この演算子がイコールの時は、それに続けてstrArrayの内容を一続きの文字列に変換の上、式をevalすれば良いでしょう。 この時イコールは対応する文字列として空文字列にしてあるので、機械的にstrArrayに追加しても式の評価の上では問題ありませんが、CEキーなどの機能性と合わせてstrArrayに追加するかどうかは再考する必要があります。

念のため書いておくと、strArrayの内容をtxtに設定するために、一続きの文字列にする手っ取り早いコードは次のような感じです。

java

1 txt1.setText(strArray.stream().collect(Collectors.joining()));

この他にもまだ不具合はありそうなので、この見直しだけではうまく動かないように思います。
いきなり演算子が押された時をどう扱うか、0除算時のエラー表示をどうするか、電卓だと、計算の後イコールを連続して押すと連続して計算されるなど、文字の入力順によるシミュレーションは結構バリエーションがありますので。

投稿2020/09/28 15:17

ironya

総合スコア456

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

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

0

数値を保持する配列を作りたい

「java 配列」でぐぐるといいです

投稿2020/09/27 01:45

y_waiwai

総合スコア88042

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問