• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ArrayListによる計算表作成)

九九の計算結果を表形式で表示する方法

このQ&Aのポイント
  • ArrayListを使用して九九の計算結果を表形式で表示する方法について説明します。
  • for文を使用して九九の計算結果を配列に格納し、その配列内の情報を表形式で表示します。
  • ソースコードの一部が改良されていないため、現在のプログラムでは1の位の計算のみが行われています。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

計算は正しく行われ、格納していますよ。 では、まず何を出力してますか? それほど変更していなければ ------------------------------------------------ ArrayList list = new ArrayList(); String[]s = new String[9]; for(int i = 1; i<=s.length; i++){ //----(1)   for(int j =1; j<=s.length; j++){ //----(2)     list.add(new Integer(i * j));     //ここがどのように記述するか??   }   System.out.print(list.get(0)); //----(3)   System.out.print(list.get(1));   System.out.print(list.get(2));   System.out.print(list.get(3));   System.out.print(list.get(4));   System.out.print(list.get(5));   System.out.print(list.get(6));   System.out.print(list.get(7));   System.out.print(list.get(8)); //----(4)   System.out.print("\n"); } ------------------------------------------------ になっていると思います。 質問者さんはきっと list.get(0)には1の段の計算結果 list.get(1)には2の段の計算結果 … list.get(8)には9の段の計算結果 が入っていると思っているでしょうが、違います。 実際は list.get(0)には1*1の計算結果 list.get(1)には1*2の計算結果 … list.get(8)には1*9の計算結果 が入っています。 まず、最初に(2)のfor文でlistの0~8に1の段の各計算結果が格納され、 (2)のfor文が終わったあとに(3)~(4)で1の段の計算結果が出力されます。 次に2回目のfor文(jが2のとき)で今度はlistの9~17に2の段の計算結果が格納されます。 が、2回目の(2)が終わったあとに、(3)~(4)で「”また”1の段の計算結果」を出力しています。 以降同様に、3~9の段を計算しても、「1の段の計算結果」しか出力していないため、 出力結果が ---------------------------- 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 ---------------------------- になってしまうのです。 ですからNo.1では System.out.print(list.get(9)); … System.out.print(list.get(80)); を表示すれば良いと答えたのですが、 (1)のfor文の中に書いてしまい、1の段の計算結果を格納した時点では2の段以降の計算結果がないため、 例外が発生しています。 だからNo.2で 外側のfor文((1)の部分のこと)の外で System.out.print(list.get(0)); … System.out.print(list.get(80)); とすれば良いと回答したのですが、…どうやら読まれていないようですね。 while文の質問のときにもアドバイスしましたが、いきなり全てを書くのではなく、 1つ1つ書いていくことをお奨めします。 今回だと ・九九の計算結果を格納する部分 ・格納した計算結果を表示する部分 に分けて考えると良いと思います。 for(){   for(){     九九の計算結果を格納   } } for(){   格納した九九の計算結果を表示 } こんな感じで。

camp-fanks
質問者

お礼

ご回答ありがとうございました。 pcbeginnerさまの解説でよく理解できていない ことと、課題のポイントがつかめました。 ありがとうございます。 こんな私ですがまたアドバイスを よろしくお願いします。

その他の回答 (3)

回答No.3

>コンパイルエラー list.add((i*j)); ArrayListにはObjectしか格納できないので。        ^^^^^^^^^^^^^^^^^^^^^ と書いてあるのですが…。 ArrayListにはObjectしか格納できません。 list.add(i*j); というのは「i*j」という基本データのint型を格納しようとしてます。 (i*jの計算結果も当然int型) だから add(Object o) とObjectのインスタンスを引数にしているaddメソッドにintを引数にしてるのでコンパイルエラーが起きるのです。 各基本データ型には「ラッパークラス」という各基本データに対応したクラスがあります。 例えばint型ならjava.lang.Integerクラスです。 他にもBooleanクラスやDoubleクラスなどもあります。 詳細はJavaDocを見て下さい。 list.add(i*j); の部分は Integer hoge = new Integer(i*j); list.add(hoge); でどうでしょうか。

camp-fanks
質問者

補足

ご回答ありがとうございます。 ラッパークラスを使用しました。 しかし、実行結果が 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 になってしまいます。 先の段の計算がうまくいきません。 プログラムのセンスと知識ないので この先もよろしくお願いします。

回答No.2

外側のfor文の外で System.out.print(list.get(0)); … System.out.print(list.get(80)); すれば大丈夫です。 ちなみに質問にあるソースはコンパイルできますか? 1.4.2_12だとコンパイルできませんよ。 list.add((i*j)); ArrayListにはObjectしか格納できないので。

camp-fanks
質問者

補足

ご回答ありがとうございます。 pcbeginnerさまのご指摘の箇所で コンパイルエラーが発生しております。 この場合、どのように記述するのか 教えていただけませんか? よろしくお願いします。

回答No.1

ぱっと見ですけど、計算はしてるんじゃないですか? ただ、計算結果を System.out.print(list.get(0)); … System.out.print(list.get(8)); としかしていないので、1の段の結果しか表示されていないのでは? System.out.print(list.get(9)); … System.out.print(list.get(80)); を表示するとどうなりますか? あと、 list.add((i * j)); のカッコが1組余分ですね。

camp-fanks
質問者

補足

ご回答ありがとうございます。 System.out.print(list.get(9)); を加えたら java.lang.IndexOutOfBoundsException (上記のソースを加えた行でエラー) でした。

関連するQ&A