質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

3998閲覧

コマンドライン上に表示したカレンダー表の成形について

LokiTick

総合スコア27

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/07/28 05:03

###前提・実現したいこと
現状、縦一列に表示されいる一年分のカレンダー表を、横に三ヶ月分ずつの縦四段表示にしたい。
実現のためのアプローチ方、ヒント等を求めます。
よろしくお願いします。

###発生している問題・エラーメッセージ
アプローチの方法がわからず、手詰まりです。

###該当のソースコード

Java

1import java.util.Calendar; 2 3class Main { 4 public static void main(String[] args) { 5 // 現在の西暦、日時取得 6 Calendar rightNow = Calendar.getInstance(); // 実行時の西暦、日付等を持つインスタンス 7 int year = rightNow.get(Calendar.YEAR);// 西暦を取得 8 int month = 0; 9 //int days = rightNow.getActualMaximum(Calendar.DATE);// 月の日数を取得 10 int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //各月の日数 11 12 // 一年分表示 13 for (int i = month; i < 12; i++) { 14 int firstDate = checkFirstDate(year, month); 15 createCalendar(days[month], year, month, firstDate); 16 month++; 17 } 18 } 19 20 21 public static void createCalendar(int days, int year, int month,int firstDate) { 22 // カレンダー作成処理開始 23 int count = 1;// 曜日判定カウント 1=sun 2 = mon 24 String[] space = { " ", " ", " " };// 整形用スペース配列 25 26 // 年月表示 27 System.out.println("\t" + year + "年" + space[2] + (month + 1) + "月\n"); 28 29 // 曜日表示処理 30 String[] weekly = { "日", "月", "火", "水", "木", "金", "土" }; 31 for (String elm : weekly) { 32 System.out.print(space[2] + elm); 33 } 34 System.out.println(""); 35 36 // 日にち表示処理 37 for (int i = 1; i <= days;) { 38 // 1日の曜日と一致しなかった場合 39 if (i == 1 && (count < firstDate)) { 40 // スペース3個を出力する 41 System.out.print(space[0]); 42 count++; 43 // 日付のサイズが1だった場合 44 } else if (String.valueOf(i).length() == 1) { 45 // スペース2個と日付を出力します 46 System.out.print(space[1] + String.valueOf(i)); 47 i++; 48 count++; 49 // 日付のサイズが2だった場合 50 } else if (String.valueOf(i).length() == 2) { 51 // スペース1個と日付を出力します 52 System.out.print(space[2] + String.valueOf(i)); 53 i++; 54 count++; 55 } 56 // 土曜日を超えた場合改行します 57 if (i != 1 && count > 7) { 58 System.out.println(""); 59 count = 1; 60 } 61 62 } 63 // 残りの枠を空白で埋める 64 if (count < 8) { 65 for (int i = count; i < 8; i++) { 66 System.out.print(space[0]); 67 } 68 System.out.println(""); 69 70 } 71 72 } 73 74 public static int checkFirstDate(int year, int month) { 75 Calendar firstDay = Calendar.getInstance(); 76 firstDay.set(Calendar.DATE, 1);// DATEフィールドの値を一日へ変更 77 firstDay.set(Calendar.MONTH, month); 78 int firstDate = firstDay.get(Calendar.DAY_OF_WEEK);// 一日の曜日の取得 1 = sun 79 return firstDate; 80 } 81} 82

###補足情報(言語/FW/ツール等のバージョンなど)
Java 8 実行環境はwindowsコマンドプロンプト

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

なかなか良い課題ですね。

簡単に修正するとしたら、System.out してる部分を配列に保存するようにします。
で、1年分のカレンダーができあがったら、まとめて3か月分を表示するようにします。

データの作成の部分を表示のロジックを分けておくと後々の修正が楽になります。

public static void createCalendar ↓ 以下のような実装にする public static String[][] createCalendar 最初のループは String[][][] calArray = new String[12][][]; for (int i = month; i < 12; i++) { int firstDate = checkFirstDate(year, month); // 配列を保存するようにする calArray[month] = createCalendar(days[month], year, month, firstDate); month++; } } // ここのループの処理を変えれば、もとの1ヶ月単位で表示へ戻すのも簡単だし、 // 配列渡して表示するメソッドを切り出しておくと、実行時の引数で表示を切り替えられます month = 0 for (int i = month; i < 12; i+=3) { // calArray[month] calArray[month+1] calArray[month+2] の第一週を表示 // calArray[month] calArray[month+1] calArray[month+2] の第二週を表示 // ・・・のようなことをループで表示 System.out.println(" 日 月 火 水 木 金 土 日 月 火 水 木 金 土 日 月 火 水 木 金 土"); for(int j = 0; j < 6; j++) { for(int x = 0; x < 3; x++) { for(int k = 0; k < 7; k++) { System.out.print( calArray[i+x][j][k] == null ? " " : calArray[i+x][j][k] ); } System.out.print(" "); } System.out.println(); } }

投稿2017/07/28 05:20

編集2017/07/31 02:01
momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LokiTick

2017/07/30 13:04

ご回答ありがとうございました。 回答の通り、createCalendarの戻り値を二次元配列にして表を作ったのですが、calArrayは一次元なので渡せずエラーになってしまいました。 私が回答の意味を理解していないせいかと思われますが、配列を使う糸口をあたえてくださってありがとうございました。
momon-ga

2017/07/31 01:46

calArrayは三次元にしてください。[12ヶ月][6週間][7日]の配列になる認識です。
LokiTick

2017/08/04 09:20

遅くなりましたが、momon-gaさんのおかげで希望の通りに表示することができました。 多次元配列の勉強になり大変参考になりました。 ありがとうございました。
guest

0

使ったことはありませんが、Java Curses Libraryが便利そうです。

投稿2017/07/28 05:07

MasashiKimura

総合スコア1150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LokiTick

2017/07/30 13:00

ご回答ありがとうございます。 今回はライブラリーなしでお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問