- ベストアンサー
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; -省略- }
- みんなの回答 (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); } こうするのが、正しいような気がするのですが・・・、
その他の回答 (2)
- yokkou
- ベストアンサー率30% (34/111)
No2の方の回答でご理解されたかと思いますが 補足で ArrayList monthList = new ArrayList(); //変数宣言を予め行っておく ArrayList dayList;//←ここで宣言 for(int count=1; count<=day; count++){ //宣言した変数を使いまわす dayList = setDay(year,month,count); monthList.add(dayList); } こう、書く方が良かったんじゃないかと思います。 あっているか、自信はありませんが(滝汗
お礼
おはようございます。 うまく行きました。 ご指導を頂いてありがとうございます。 また、よろしくお願いいたします。 美咲 優花より
monthListをループのなかで毎回newしてるからではないでしょうか?
お礼
おはようございます。 うまく行きました。 ご指導を頂いてありがとうございます。 また、よろしくお願いいたします。 美咲 優花より
お礼
おはようございます。 うまく行きました。 ご指導を頂いてありがとうございます。 また、よろしくお願いいたします。 美咲 優花より