アプリ版:「スタンプのみでお礼する」機能のリリースについて

for文を使用し九九の計算結果を配列に格納し、その配列内の情報を表形式で表示してみる。※配列はArrayListを使用すること

上記の問題を解いています。

--------------------------------------------------------------
import java.util.ArrayList;
public class m4_2 {
public static void main(String args[])
{
ArrayList list = new ArrayList();
String[]s = new String[9];
for(int i = 1; i<=s.length; i++){
for(int j =1; j<=s.length; j++){
list.add((i * j));

    //ここがどのように記述するか??

}
System.out.print(list.get(0));
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));
System.out.print("\n");
}
}
}

----------------------------------------------------------
実行結果イメージ
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
(以下省略)

私の書いたソースでは1の位しか計算してくれません。
今月から本格的にJavaを勉強し始めた初心者なので
どうかよろしくお願いいたします。

A 回答 (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(){
  格納した九九の計算結果を表示
}
こんな感じで。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
pcbeginnerさまの解説でよく理解できていない
ことと、課題のポイントがつかめました。
ありがとうございます。

こんな私ですがまたアドバイスを
よろしくお願いします。

お礼日時:2006/11/08 19:32

>コンパイルエラー


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);
でどうでしょうか。

この回答への補足

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

補足日時:2006/11/08 13:13
    • good
    • 0

外側のfor文の外で


System.out.print(list.get(0));

System.out.print(list.get(80));
すれば大丈夫です。

ちなみに質問にあるソースはコンパイルできますか?
1.4.2_12だとコンパイルできませんよ。
list.add((i*j));
ArrayListにはObjectしか格納できないので。

この回答への補足

ご回答ありがとうございます。
pcbeginnerさまのご指摘の箇所で
コンパイルエラーが発生しております。

この場合、どのように記述するのか
教えていただけませんか?
よろしくお願いします。

補足日時:2006/11/07 21:28
    • good
    • 0

ぱっと見ですけど、計算はしてるんじゃないですか?


ただ、計算結果を
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組余分ですね。

この回答への補足

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

補足日時:2006/11/07 19:15
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!