C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: java Listインターフェースについて


(過去ログ 117 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■68706 / inTopicNo.1)  java Listインターフェースについて
  
□投稿者/ FabbricaKM (3回)-(2013/11/08(Fri) 10:05:50)

分類:[Java] 

初心者ではないのですが、初心者のような事で困っています。
Listインターフェースに関してですが、以下のようなコードがあります。


List<String> strings = new ArrayList<String>();
strings.add("String001");
strings.add("String002");

System.out.println(strings.get(0));
System.out.println(strings.get(1));

当然コンソールに出力されるのは
String001
String002
です。
ここまでは何の問題もありません。

ところが、まずは、下記のDayクラスを作ります。
public class Day {
private Calendar day;
public Calendar getDay() {
return this.day;
}

/**
* 曜日を示す値を取得する。
* @return int 曜日を示す値 1(日曜日)〜7(土曜日)
*/
public int getDayOfWeek() {
return this.day.get(Calendar.DAY_OF_WEEK);
}
public int date;
/**
* コンストラクタ。
* @param day 当該日付のCalendar
*/
public Day(Calendar day, int date) {
this.day = day;
this.date = date;
}

/**
* 日にちを文字列で取得する。
* @param format SimpleDateFormatの書式文字列 "d"か"dd"のいづれか
* @return 日にちの文字列 "1"〜"31"、あるいは"01"〜"31"
*/
public String getDay(SimpleDateFormat format) {
return format.format(this.day.getTime());
}
}

そして、このDayクラスのインスタンスを生成するDayDataCreaterクラスを作ります。
lic class DayDataCreater {
/**
* DayDataを作成する年月
*/
private Calendar month;

public ArrayList<Day> days;
public ArrayList<Day> getDays() {
return this.days;
}

/**
* コンストラクタ
* @param month DayDataを作成する年月
*/
public DayDataCreater(Calendar month) {
this.month = month;

this.days = new ArrayList<Day>();
}

/**
* DayDataを作成する
*/
public void createDayData() {
// コレクションの対象となる月
int targetMonth = this.month.get(Calendar.MONTH);

// コレクションの対象となる月の1日目を生成
Calendar checkCalendar = this.month;
checkCalendar.set(Calendar.DATE, 1);
//System.out.println(checkCalendar.getTime());

// 月が変わるまでコレクションを追加
while(checkCalendar.get(Calendar.MONTH) == targetMonth) {
Day day = new Day(checkCalendar, checkCalendar.get(Calendar.DATE));
//System.out.println(day.getDay().getTime());
this.days.add(day);

checkCalendar.add(Calendar.DATE, 1);
//System.out.println(checkCalendar.getTime());
//System.out.println("days size =" + this.days.size());
}
}
}

そして、このDayDataCreaterクラスをテストするためのJUnitクラスを作りました。
@Test
public void testCreateDayData() {
System.out.println("createDayData");
DayDataCreater instance = new DayDataCreater(this.calendar);
instance.createDayData();
//ArrayList<Day> result = instance.getDays();
List<Day> result = instance.days;

//System.out.println("days size =" + result.size());

Day day = result.get(15);
System.out.println(day.getDay().getTime());
System.out.println(day.getDay(new SimpleDateFormat("dd")));

//day = result.get(29);
//System.out.println(day.getDay().getTime());
// TODO review the generated test code and remove the default call to fail.
//fail("The test case is a prototype.");
}

すると、resultコレクションのどの要素のCalendarを出力しても
Sun Dec 01 09:38:49 JST 2013
となってしまいます。

私の考えでは、コレクションの最初の要素では
Fri Nov 01 09:38:49 JST 2013
最後の要素では
Sat Nov 30 09:38:49 JST 2013
が出力されるはずで、Sun Dec 01 、つまり12月1日が出力される理由がさっぱりわからず、昨日からハマっています。
ごく基本的な勘違いをしていると思っているのですが、理由をご教示頂ければ幸いです。

引用返信 編集キー/
■68707 / inTopicNo.2)  Re[1]: java Listインターフェースについて
□投稿者/ shu (416回)-(2013/11/08(Fri) 10:57:24)
No68706 (FabbricaKM さん) に返信

> Day day = new Day(checkCalendar, checkCalendar.get(Calendar.DATE))
のcheckCalendarインスタンスがすべて同じものなので最後の日が表示されます。
1要素づつCalendarのインスタンスを渡す必要があります。
引用返信 編集キー/
■68708 / inTopicNo.3)  Re[2]: java Listインターフェースについて
□投稿者/ FabbricaKM (5回)-(2013/11/08(Fri) 11:17:33)
No68707 (shu さん) に返信
> ■No68706 (FabbricaKM さん) に返信
>
>>Day day = new Day(checkCalendar, checkCalendar.get(Calendar.DATE))
> のcheckCalendarインスタンスがすべて同じものなので最後の日が表示されます。
> 1要素づつCalendarのインスタンスを渡す必要があります。

なるほど。
while(checkCalendar.get(Calendar.MONTH) == targetMonth) {
Calendar calendar = (Calendar)checkCalendar.clone();
Day day = new Day(calendar, checkCalendar.get(Calendar.DATE));
//System.out.println(day.getDay().getTime());
this.days.add(day);

checkCalendar.add(Calendar.DATE, 1);
//System.out.println(checkCalendar.getTime());
//System.out.println("days size =" + this.days.size());
}
とする事で解決しました。
javaの引数は参照渡し、でしたね。忘れてました。


どうもありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -