- ベストアンサー
Javaのカレンダー作成について
- コマンドライン引数で渡された6桁の数字をカレンダーに起こすプログラムを作成しています。
- java.util.Calendarクラスを使用して、指定された年と月を設定し、カレンダーを表示します。
- カレンダーの日付は1日から月末日まで表示され、空白は日曜日から開始される曜日の数に応じて挿入されます。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
このサイトは連続した空白は1つに纏められてしまうようです(^_^;空白を纏めないで…)
その他の回答 (4)
- amanojaku1
- ベストアンサー率54% (265/488)
> ************** > for (int day = 1 ; day <= lastDay; day ++) { > if (day < 10) { > ●System.out.print(" " + day + " "); > } else { > ●System.out.print( day + " "); > } > ************** > ●の部分の出力はループの外で一つに纏められるはずだと指摘されました。 「if 文のの外で一つに纏められるはず」ですね? 随分 厳しい事 言いますね、厳しければ それだけ上達も早いかもしれませんが。 恐らく「三項演算子」を使えと言う事だと思います(詳細はネットで検索して下さい)。 > //weekset分回す > for (int i = 0; i < weekset; i++) { > System.out.print(" "); // ← > counter ++; > } 「System.out.print(" ");」←空白が全部で3個必要では? > System.out.println(" 日 月 火 水 木 金 土"); 1つ目の空白をなくして「"日 月 火 水 木 金 土"」にした方が位置が合います。 public class Calendar { public static void main(String[] args) { java.util.Calendar cal = java.util.Calendar.getInstance(); int year = Integer.parseInt(args[0].substring(0, 4)); int month = Integer.parseInt(args[0].substring(4)); cal.set(java.util.Calendar.YEAR, year); cal.set(java.util.Calendar.MONTH, month - 1); cal.set(java.util.Calendar.DAY_OF_MONTH, 1); int week = cal.get(java.util.Calendar.DAY_OF_WEEK); //日曜始まり一週間のセット作成 int weekset = 0; if (week == cal.SUNDAY) { weekset = 0; } else if (week == cal.MONDAY) { weekset = 1; } else if (week == cal.TUESDAY) { weekset = 2; } else if (week == cal.WEDNESDAY) { weekset = 3; } else if (week == cal.THURSDAY) { weekset = 4; } else if (week == cal.FRIDAY) { weekset = 5; } else if (week == cal.SATURDAY) { weekset = 6; } //月末日 int lastDay = cal.getActualMaximum(java.util.Calendar.DAY_OF_MONTH); System.out.println( year + "年" + month + "月"); System.out.println("日 月 火 水 木 金 土"); int w; int i = 0; for(int day = 1-weekset; day<=lastDay; day++){ String sday = String.valueOf(day); // 三項演算子:条件 ? 真の場合 : 偽の場合 String s3day = (day<1)?" " :((day<10)?(" "+sday+" "):(sday+" ")); System.out.print(s3day); w = i % 7; // 割り算の余。 // 分かりやすくするために変数 w を使ってますが、 // 実際は変数 w を使わず直接 if((i % 7)==6)とした方が良いでしょう。 if(w==6){ System.out.println( ); } i++; } } }
お礼
ご回答ありがとうございました。 たった今自己解決いたしまして・・・ for文の前の空白出力用のString変数を用意しておく方法で纏まりました。 もう一つのご回答の方に記載させていただきます!
- maiko0333
- ベストアンサー率19% (839/4401)
前言撤回。 int startDay = cal.get(java.util.Calendar.DAY_OF_WEEK); は曜日を数字で表していますので、 そのまま使うことができます。 weekとweeksetは同じ値が設定されています。 もちろん、曜日と数字の対応が変更されるかもしれないことを考えれば 1つづつ比較したほうが正解ではあります。
お礼
ご回答ありがとうございました。
- maiko0333
- ベストアンサー率19% (839/4401)
ちなみにWeeksetは int startDay = cal.get(java.util.Calendar.DAY_OF_WEEK); とすれば日曜日=1,月曜日=2、火曜日=3,,,,土曜日=7という値が取り出せます。
お礼
ご回答ありがとうございました。
- maiko0333
- ベストアンサー率19% (839/4401)
私なら、 for (int day = 1 ; day <= lastDay; day ++) { if (day < 10) System.out.print(" "); System.out.print( day + " "); } としますね。 for (int day = 1 ; day < 10; day ++) { System.out.print(" " + day + " "); } for (; day <= lastDay; day ++) { System.out.print( day + " "); } こうすればループの中で判断するという無駄がなくなりますね。 まぁ、ここは1ヶ月分だし多くて31回だけど、 2000年×12ヶ月とか回すならこっちがいいですね。
お礼
ご回答ありがとうございました。 私の求めている答えとは正確には微妙に違うようなのですが、それでも他の点で色々と気付くことが出来たように思います。 またどうぞよろしくお願いいたします。
お礼
下記で良いそうです(本当はcounter ==7 で改行についてもう一意見(土曜日改行にしたほうが良い)あるそうなのですが・・・;; またそれは別に考えたいと思います;) public class CalShow { public static void main(String[] args) { java.util.Calendar cal = java.util.Calendar.getInstance(); int year = Integer.parseInt(args[0].substring(0, 4)); int month = Integer.parseInt(args[0].substring(4)); cal.set(java.util.Calendar.YEAR, year); cal.set(java.util.Calendar.MONTH, month - 1); cal.set(java.util.Calendar.DAY_OF_MONTH, 1); //日曜日=1で土曜日=7まで int week = cal.get(java.util.Calendar.DAY_OF_WEEK); //月末日 int lastDay = cal.getActualMaximum(java.util.Calendar.DAY_OF_MONTH); //7日ごとに改行するカウンタ用意 int counter = 0; System.out.println( year + "年" + month + "月"); System.out.println(" 日 月 火 水 木 金 土"); //week分回す for (int i = 1; i < week ; i ++) { System.out.print(" "); counter ++; } String empty; //1日から月末日まで、カレンダーを表示する for (int day = 1 ; day <= lastDay ; day ++) { empty = ""; if (day < 10) { empty = " "; } System.out.print( empty + day + " "); counter ++; if (counter == 7) { //7日おきにリセットして改行 counter = 0; System.out.println(); } } } } 本当に感謝しております! 分からないことがありましたらまた是非よろしくお願いいたします;;