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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.68706 の関連記事表示

<< 0 >>
■68706  java Listインターフェースについて
□投稿者/ FabbricaKM -(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日が出力される理由がさっぱりわからず、昨日からハマっています。
    ごく基本的な勘違いをしていると思っているのですが、理由をご教示頂ければ幸いです。
親記事 /過去ログ117より / 関連記事表示
削除チェック/

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

    > Day day = new Day(checkCalendar, checkCalendar.get(Calendar.DATE))
    のcheckCalendarインスタンスがすべて同じものなので最後の日が表示されます。
    1要素づつCalendarのインスタンスを渡す必要があります。
記事No.68706 のレス /過去ログ117より / 関連記事表示
削除チェック/

■68708  Re[2]: java Listインターフェースについて
□投稿者/ FabbricaKM -(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の引数は参照渡し、でしたね。忘れてました。


    どうもありがとうございました。
記事No.68706 のレス / END /過去ログ117より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -