回答編集履歴

4

;を入れ忘れる凡ミス

2019/10/15 03:53

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -140,7 +140,7 @@
140
140
 
141
141
  Map.entry(MonthDay.of(12, 31), "山羊座")
142
142
 
143
- ))
143
+ ));
144
144
 
145
145
 
146
146
 

3

TreeMap版追加

2019/10/15 03:53

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -111,3 +111,43 @@
111
111
  }
112
112
 
113
113
  ```
114
+
115
+
116
+
117
+ また、TreeMapを使えばこんな書き方もできます(Map生成の書き方はJava9以降)。
118
+
119
+ ただここまで長くなると、static importを使わずに書くのはつらいし見づらい…
120
+
121
+ ```java
122
+
123
+ // 星座名取得.
124
+
125
+ public static String getSeiza(MonthDay date) {
126
+
127
+ TreeMap<MonthDay, String> lastDayOfSeiza = new TreeMap<>(
128
+
129
+ Map.ofEntries(Map.entry(MonthDay.of(1, 19), "山羊座"), Map.entry(MonthDay.of(2, 18), "水瓶座"),
130
+
131
+ Map.entry(MonthDay.of(3, 20), "魚座"), Map.entry(MonthDay.of(4, 19), "牡羊座"),
132
+
133
+ Map.entry(MonthDay.of(5, 20), "牡牛座"), Map.entry(MonthDay.of(6, 21), "双子座"),
134
+
135
+ Map.entry(MonthDay.of(7, 22), "蟹座"), Map.entry(MonthDay.of(8, 22), "しし座"),
136
+
137
+ Map.entry(MonthDay.of(9, 22), "乙女座"), Map.entry(MonthDay.of(10, 23), "てんびん座"),
138
+
139
+ Map.entry(MonthDay.of(11, 22), "蠍座"), Map.entry(MonthDay.of(12, 21), "射手座"),
140
+
141
+ Map.entry(MonthDay.of(12, 31), "山羊座")
142
+
143
+ ))
144
+
145
+
146
+
147
+ return lastDayOfSeiza.ceilingEntry(date).getValue();
148
+
149
+ }
150
+
151
+
152
+
153
+ ```

2

MonthDay利用

2019/10/15 02:47

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -37,3 +37,77 @@
37
37
  }
38
38
 
39
39
  ```
40
+
41
+
42
+
43
+ また、Java8以降なら[MonthDay](https://docs.oracle.com/javase/jp/8/docs/api/java/time/MonthDay.html)と[DateTimeFormatter](https://docs.oracle.com/javase/jp/8/docs/api/java/time/format/DateTimeFormatter.html)を使って、入力された日付の妥当性チェックもまとめて行うこともできます。
44
+
45
+
46
+
47
+ ```java
48
+
49
+ public class Constellation {
50
+
51
+ public static void main(String[] args) {
52
+
53
+ try {
54
+
55
+ // 日付変換 不適当な入力であればDateTimeParseException発生
56
+
57
+ MonthDay date = MonthDay.parse(args[0], DateTimeFormatter.ofPattern("MMdd"));
58
+
59
+ // 星座名取得.
60
+
61
+ String seizaName = getSeiza(date);
62
+
63
+ System.out.println(seizaName);
64
+
65
+
66
+
67
+ } catch (DateTimeParseException e) {
68
+
69
+ System.out.println("日付が正しくない");
70
+
71
+ }
72
+
73
+ }
74
+
75
+
76
+
77
+ // 星座名取得.
78
+
79
+ public static String getSeiza(MonthDay date) {
80
+
81
+ String[] seizaName = {"山羊座", "水瓶座", "魚座", "牡羊座", "牡牛座", "双子座",
82
+
83
+ "蟹座", "しし座", "乙女座", "てんびん座", "蠍座", "射手座"};
84
+
85
+ // 各星座の年内の最後の月日
86
+
87
+ MonthDay[] lastDays = {MonthDay.of(1, 19), MonthDay.of(2, 18), MonthDay.of(3, 20),
88
+
89
+ MonthDay.of(4, 19), MonthDay.of(5, 20), MonthDay.of(6, 21),
90
+
91
+ MonthDay.of(7, 22), MonthDay.of(8, 22), MonthDay.of(9, 22),
92
+
93
+ MonthDay.of(10, 23), MonthDay.of(11, 22), MonthDay.of(12, 21)};
94
+
95
+ for (int i = 0; i < lastDays.length; i++) {
96
+
97
+ if (date.compareTo(lastDays[i]) <= 0) {
98
+
99
+ return seizaName[i];
100
+
101
+ }
102
+
103
+ }
104
+
105
+ // 12月22日以降だった場合
106
+
107
+ return seizaName[0];
108
+
109
+ }
110
+
111
+ }
112
+
113
+ ```

1

説明の追加

2019/10/14 17:04

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -1,4 +1,8 @@
1
- 基本的に配列を使って「月」で割り振る。月ごとが切り替わ日付が異なるので、その日以降の日であれば月を1増やす
1
+ 基本的に配列を使って「月」で割り振る。例えば1は基本的山羊と考える。
2
+
3
+ 月ごとに星座が切り替わる日付も配列で管理し、ある月でその日以降の日であれば月を1増やす。1月は20日以降が水瓶座なので、それを「2月」として扱う。
4
+
5
+ 12月の次の月になった場合は1月に戻す。
2
6
 
3
7
 
4
8