teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

;を入れ忘れる凡ミス

2019/10/15 03:53

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -69,7 +69,7 @@
69
69
  Map.entry(MonthDay.of(9, 22), "乙女座"), Map.entry(MonthDay.of(10, 23), "てんびん座"),
70
70
  Map.entry(MonthDay.of(11, 22), "蠍座"), Map.entry(MonthDay.of(12, 21), "射手座"),
71
71
  Map.entry(MonthDay.of(12, 31), "山羊座")
72
- ))
72
+ ));
73
73
 
74
74
  return lastDayOfSeiza.ceilingEntry(date).getValue();
75
75
  }

3

TreeMap版追加

2019/10/15 03:53

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -54,4 +54,24 @@
54
54
  return seizaName[0];
55
55
  }
56
56
  }
57
+ ```
58
+
59
+ また、TreeMapを使えばこんな書き方もできます(Map生成の書き方はJava9以降)。
60
+ ただここまで長くなると、static importを使わずに書くのはつらいし見づらい…
61
+ ```java
62
+ // 星座名取得.
63
+ public static String getSeiza(MonthDay date) {
64
+ TreeMap<MonthDay, String> lastDayOfSeiza = new TreeMap<>(
65
+ Map.ofEntries(Map.entry(MonthDay.of(1, 19), "山羊座"), Map.entry(MonthDay.of(2, 18), "水瓶座"),
66
+ Map.entry(MonthDay.of(3, 20), "魚座"), Map.entry(MonthDay.of(4, 19), "牡羊座"),
67
+ Map.entry(MonthDay.of(5, 20), "牡牛座"), Map.entry(MonthDay.of(6, 21), "双子座"),
68
+ Map.entry(MonthDay.of(7, 22), "蟹座"), Map.entry(MonthDay.of(8, 22), "しし座"),
69
+ Map.entry(MonthDay.of(9, 22), "乙女座"), Map.entry(MonthDay.of(10, 23), "てんびん座"),
70
+ Map.entry(MonthDay.of(11, 22), "蠍座"), Map.entry(MonthDay.of(12, 21), "射手座"),
71
+ Map.entry(MonthDay.of(12, 31), "山羊座")
72
+ ))
73
+
74
+ return lastDayOfSeiza.ceilingEntry(date).getValue();
75
+ }
76
+
57
77
  ```

2

MonthDay利用

2019/10/15 02:47

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -17,4 +17,41 @@
17
17
  }
18
18
  return seizaName[index];
19
19
  }
20
+ ```
21
+
22
+ また、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)を使って、入力された日付の妥当性チェックもまとめて行うこともできます。
23
+
24
+ ```java
25
+ public class Constellation {
26
+ public static void main(String[] args) {
27
+ try {
28
+ // 日付変換 不適当な入力であればDateTimeParseException発生
29
+ MonthDay date = MonthDay.parse(args[0], DateTimeFormatter.ofPattern("MMdd"));
30
+ // 星座名取得.
31
+ String seizaName = getSeiza(date);
32
+ System.out.println(seizaName);
33
+
34
+ } catch (DateTimeParseException e) {
35
+ System.out.println("日付が正しくない");
36
+ }
37
+ }
38
+
39
+ // 星座名取得.
40
+ public static String getSeiza(MonthDay date) {
41
+ String[] seizaName = {"山羊座", "水瓶座", "魚座", "牡羊座", "牡牛座", "双子座",
42
+ "蟹座", "しし座", "乙女座", "てんびん座", "蠍座", "射手座"};
43
+ // 各星座の年内の最後の月日
44
+ MonthDay[] lastDays = {MonthDay.of(1, 19), MonthDay.of(2, 18), MonthDay.of(3, 20),
45
+ MonthDay.of(4, 19), MonthDay.of(5, 20), MonthDay.of(6, 21),
46
+ MonthDay.of(7, 22), MonthDay.of(8, 22), MonthDay.of(9, 22),
47
+ MonthDay.of(10, 23), MonthDay.of(11, 22), MonthDay.of(12, 21)};
48
+ for (int i = 0; i < lastDays.length; i++) {
49
+ if (date.compareTo(lastDays[i]) <= 0) {
50
+ return seizaName[i];
51
+ }
52
+ }
53
+ // 12月22日以降だった場合
54
+ return seizaName[0];
55
+ }
56
+ }
20
57
  ```

1

説明の追加

2019/10/14 17:04

投稿

swordone
swordone

スコア20675

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