以下の方法で可能でしょうか?
他にスマートな方法はありませんか?
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;
以下略
*/
1.すべての組み合わせをマップに入れる。
ex. map.put(new Date(”9/1”), A画像);
2.表示日付に対応する画像を取り出す。
ex. obj = map.get(new Date(”12/19”));
3.objがnullだったら表示しない。objが画像なら表示する。
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変数にしましたが、クラス変数にしても良いでしょう。
上記方法は書くのが簡単ですが、判定に時間がかかる欠点があります。
もし判定時間の遅さが問題になるのであれば、別の方法もあります。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html
Java 2 Platform SE 5.0
あまり、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を使って取り出して使うと良いかと思います。
参考になりますでしょうか。
ありがとうございました