dポイントプレゼントキャンペーン実施中!

スケジュールのプログラムを作成していまして、1日分のオブジェクトをArrayListにいれて、さらに、1日分のArrayLisのオブジェクトを1ヶ月のArrayListにいれました。

そこで、1ヶ月のArrayListのオブジェクトから1日のArrayListのオブジェクトに分解して、表示したところに、最後の日にちの件数が表示されました。

1.ArrayListにオブジェクトをいれますと、うまく表示されます。
2.ArrayListにArrayListオブジェクトをいれまして、総件数を表示したら、1日から31日までのArrayListのsizeメソッドが最後の日にちが表示されます。よって1日から30日のArrayListに31日分のArrayListが上書きされているように思われます。

1と2の違いと原因をご教授下さい。

//arraylist作成1ヶ月分。
public ArrayList setMonth(int year,int month,int user_id){
-省略-
ArrayList monthList=null;

for(int count=1; count<=day; count++){
monthList=new ArrayList();
ArrayList dayList=new ArrayList();
dayList=setDay(year,month,count);
monthList.add(dayList);
}

for(int a=0; a<monthList.size(); a++){
ArrayList saa = (ArrayList)monthList.get(a);
int mm= saa.size();
System.out.println("mm:"+mm);
}
return monthList;
-省略-
}

//ArrayList作成1日分
public ArrayList setDay(int year,int month,int day){

ArrayList aList = new ArrayList();
-省略-
while(rs.next()){
Allday schAll=new Allday();
schAll.setSchedule_id(rs.getInt("schedule_id"));
schAll.setContents(rs.getString("contents"));
aList.add(schAll);
}

for(int b=0; b<aList.size(); b++){
int si= ((Allday)aList.get(b)).getSchedule_id();
String con=((Allday)aList.get(b)).getContents();
}
return aList;
-省略-
}

A 回答 (3件)

 こんばんは。



1:ArrayList monthList=null;
2:
3:for(int count=1; count<=day; count++){
4: monthList=new ArrayList();
5: ArrayList dayList=new ArrayList();
6: dayList=setDay(year,month,count);
7: monthList.add(dayList);
8:}

 4行目はおかしくないですか?
 これでは、forループが回るたびに新しいArrayListのインスタンスを作ってしまいませんか。
 一回転目で1日目のデータを入れても、2回転目には、あたらしいArrayListができてしまい、さっきのArrayListは1日目のデータとともに、ガーベージコレクションの対象になって、消えていってしまいます。
 それを31回繰り返し、結局、31日目のデータを入れた最後のリストが生き残っているように思います。

 あと、5行目も結局6行目でsetDayメソッドから返ってくるArrayListのインスタンスを代入しているので、無駄ですよね。

ArrayList monthList = new ArrayList();

for(int count=1; count<=day; count++){
  ArrayList dayList = setDay(year,month,count);
  monthList.add(dayList);
}

 こうするのが、正しいような気がするのですが・・・、
    • good
    • 0
この回答へのお礼

おはようございます。
うまく行きました。
ご指導を頂いてありがとうございます。
また、よろしくお願いいたします。
    美咲 優花より

お礼日時:2006/08/01 10:04

No2の方の回答でご理解されたかと思いますが


補足で

ArrayList monthList = new ArrayList();
//変数宣言を予め行っておく
ArrayList dayList;//←ここで宣言

for(int count=1; count<=day; count++){
  //宣言した変数を使いまわす
  dayList = setDay(year,month,count);
  monthList.add(dayList);
}

こう、書く方が良かったんじゃないかと思います。

あっているか、自信はありませんが(滝汗
    • good
    • 0
この回答へのお礼

おはようございます。
うまく行きました。
ご指導を頂いてありがとうございます。
また、よろしくお願いいたします。
    美咲 優花より

お礼日時:2006/08/01 10:03

monthListをループのなかで毎回newしてるからではないでしょうか?

    • good
    • 0
この回答へのお礼

おはようございます。
うまく行きました。
ご指導を頂いてありがとうございます。
また、よろしくお願いいたします。
    美咲 優花より

お礼日時:2006/08/01 10:05

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