JAVAを使って4つの画像を以下のように8月、9月、10月等毎月表示します。

以下の方法で可能でしょうか?
他にスマートな方法はありませんか?

A画像の表示期間
9月1日〜9月6日
9月10日〜9月13日
9月16日〜9月17日
9月21日〜9月24日
9月28日〜9月30日
C画像の表示期間
9月1日〜9月5日
9月21日〜9月30日
以下略


int month=cal.get(Calendar.MONTH)+1;
int day=cal.get(Calendar.DATE);

switch(month){
case9: //9月
if((day==5)||(day==6)||(day==10)||(day==11)||(day==12)・・・・・・・)
 A画像選択(アクティブ)メソッド

 if(((day>=1)&&(day=<5))||((day>=21)&&(day=<30)))
C画像選択(アクティブ)メソッド

 break;
以下略

*/

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:tarchan No.1

回答回数200ベストアンサー獲得回数2

ポイント60pt

1.すべての組み合わせをマップに入れる。


ex. map.put(new Date(”9/1”), A画像);


2.表示日付に対応する画像を取り出す。


ex. obj = map.get(new Date(”12/19”));


3.objがnullだったら表示しない。objが画像なら表示する。

id:ether731 No.2

回答回数1ベストアンサー獲得回数0

ポイント100pt

http://www.hatena.ne.jp/1134906024

人力検索はてな - JAVAを使って4つの画像を以下のように8月、9月、10月等毎月表示します。 以下の方法で可能でしょうか? 他にスマートな方法はありませんか? A画像の表示期間 9月1..

(URLはダミーです)

上記方法でも動くと思いますが、もう少しスマートな方法としては以下の方法があります。

表示する日付範囲の開始日,終了日を交互に配列に入れておき、これを読んで判定を

行います。(注:コンパイル確認はしていません)


以下をメソッドの外で宣言

// 各月ごとに、画像Aを表示する日付範囲

static int ranges_A[][] = {

{ }, // 0月:表示する日なし

{ 1, 10, 20, 21}, //1月 : 1から10日までと20から21日まで表示

{ 3, 7 }, // 2月 : 3から7日まで表示

..

{ 1, 6, 28, 30 } // 12月

};


// 各月ごとに、画像Cを表示する日付範囲

static int ranges_C[][] = {

{ }, // 0月

{ 1, 5, 21, 30 }, // 1月

....

{ 3, 10 } // 12月

};


以下がメソッド内の記述


int month=cal.get(Calendar.MONTH)+1;

int day=cal.get(Calendar.DATE);


int i;


for(i = 0; i < ranges_A[month].length; i += 2){

if((ranges_A[month][i] <= day) && (day <= ranges_A[month][i+1])){

 A画像選択(アクティブ)メソッド

}

}

for(i = 0; i < ranges_C[month].length; i += 2){

if((ranges_C[month][i] <= day) && (day <= ranges_C[month][i+1])){

C画像選択(アクティブ)メソッド

}

}


以下略


配列はstatic変数にしましたが、クラス変数にしても良いでしょう。

上記方法は書くのが簡単ですが、判定に時間がかかる欠点があります。

もし判定時間の遅さが問題になるのであれば、別の方法もあります。

id:angelsong No.3

回答回数94ベストアンサー獲得回数0

ポイント100pt

あまり、switchやifを並べてしまうとメンテナンスが大変になりそうなので、下記のような感じでどうでしょうか。

GregorianCalendar today = new GregorianCalendar();


if (this.isShowA()) {

//A画像選択メソッド

}


if (this.isShowB()) {

//B画像選択メソッド

}


private boolean isShowA(GregorianCalendar day) {

// 9/1~9/6

GregorianCalendar firstDay = new GregorianCalendar(2005,9,1);

GregorianCalendar lastDay = new GregorianCalendar(2005,9,6 + 1);

if (cal.after(firstDay) || cal.equals(firstDay) {

return true;

}

if (cal.before(lastDay) || cal.equals(lastDay) {

return true;

}

// 以下略

return false;

}


private boolean isShowB(GregorianCalendar cal) {

// 以下略


毎年同じ月日を使う場合には、定数”2005”をCalendarからDateFormatを使って取り出して使うと良いかと思います。


参考になりますでしょうか。

id:MostInakappe

ありがとうございました

2005/12/24 20:27:29

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません