• ベストアンサー

ArrayListなかへのArrayListオブジェクトのセット方法

スケジュールのプログラムを作成していまして、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; -省略- }

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

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.2

 こんばんは。 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); }  こうするのが、正しいような気がするのですが・・・、

misaki777v
質問者

お礼

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

その他の回答 (2)

  • yokkou
  • ベストアンサー率30% (34/111)
回答No.3

No2の方の回答でご理解されたかと思いますが 補足で ArrayList monthList = new ArrayList(); //変数宣言を予め行っておく ArrayList dayList;//←ここで宣言 for(int count=1; count<=day; count++){   //宣言した変数を使いまわす   dayList = setDay(year,month,count);   monthList.add(dayList); } こう、書く方が良かったんじゃないかと思います。 あっているか、自信はありませんが(滝汗

misaki777v
質問者

お礼

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

noname#19197
noname#19197
回答No.1

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

misaki777v
質問者

お礼

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

関連するQ&A