
スケジュールのプログラムを作成していまして、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;
-省略-
}
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);
}
こうするのが、正しいような気がするのですが・・・、
おはようございます。
うまく行きました。
ご指導を頂いてありがとうございます。
また、よろしくお願いいたします。
美咲 優花より
No.3
- 回答日時:
No2の方の回答でご理解されたかと思いますが
補足で
ArrayList monthList = new ArrayList();
//変数宣言を予め行っておく
ArrayList dayList;//←ここで宣言
for(int count=1; count<=day; count++){
//宣言した変数を使いまわす
dayList = setDay(year,month,count);
monthList.add(dayList);
}
こう、書く方が良かったんじゃないかと思います。
あっているか、自信はありませんが(滝汗
おはようございます。
うまく行きました。
ご指導を頂いてありがとうございます。
また、よろしくお願いいたします。
美咲 優花より
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JAVA エラー 式の開始が不正で...
-
DataSet(DataTable)の使い方
-
式の型は配列型で int に解決済...
-
「配列定数は、イニシャライザ...
-
C++からC#のdllを参照する際、...
-
C言語からJavaに書き換えの質...
-
C#で、あるクラスのメンバーす...
-
オブジェクトの中のプロパティ...
-
IF関数でEmpty値を設定する方法。
-
続・ZZZ,ZZZ,ZZ9形式の金額形式...
-
C言語のポインターに関する警告
-
動的配列が存在(要素が有る)か...
-
1ページに10件ずつ表示したい
-
実数からの小数部の取得
-
ORA-01858: 数値を指定する箇所...
-
変数を動的に作るには?
-
BOOL値を逆にしたい
-
hiddenの値が期待した値で取得...
-
特定の文字列が一致する行から...
-
System.out.printlnの出力先
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「配列定数は、イニシャライザ...
-
メインが含まれていません
-
式の型は配列型で int に解決済...
-
javaでカレンダー作成
-
DataSet(DataTable)の使い方
-
Java 初心者 int型の取り扱い方
-
java初心者の質問(3つの整数の...
-
javaでcsvファイル読込時の改行...
-
Java 日付の加算がうまくいき...
-
JAVA エラー 式の開始が不正で...
-
6桁の数字を重複なしでランダム...
-
コンパイルできません
-
SwingでJtableのヘッダ行が表示...
-
C#で実行時にメソッドの返り値...
-
intが負の時に投げる例外はあり...
-
意味がわかりません
-
コンパイラが注意してくる
-
複数のボタンを配置し、それぞ...
-
Threadに関するの質問
-
C#でバブルソート
おすすめ情報