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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

2回答

1156閲覧

enumを利用して、入力した値ごとに処理を分けたい

koutarou55478

総合スコア1

Java

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2021/06/02 11:16

java初心者です。
enumを使って星座判定をさせるプログラムを作ってみているのですが、
enumの使い方が上手く応用できません。
言語の本を買ったりネットで調べてみているのですが、
どうも詰まってしまったのでアドバイスをお願いしたいです。

前提・実現したいこと

メインで入力した年、月、日によって
星座を出力させたい

該当のソースコード

java

1 2public class Main { 3 4 public static void main(String[] args) { 5 Constellation constellation = Constellation.Aquarius; 6 7 System.out.println(constellation.toString()); 8 9 System.out.println("**********星座判定**********"); 10 System.out.println("誕生年を入力してください (例:1998->1998)"); 11 int year = new java.util.Scanner(System.in).nextInt(); 12 System.out.println("誕生月を入力してください (例:11月->11)"); 13 int month = new java.util.Scanner(System.in).nextInt(); 14 System.out.println("誕生日を入力してください (例:22日->22)"); 15 int day = new java.util.Scanner(System.in).nextInt(); 16 17 System.out.println(year+"年"+month+"月"+day+"日生まれのあなたの星座は"+constellation+"です"); 18 19 switch (constellation) { 20 case Aries: 21 System.out.println("牡羊座"); 22 break; 23 24 case Taurus: 25 System.out.println("牡牛座"); 26 break; 27 28 case Gemini: 29 System.out.println("双子座"); 30 break; 31 32 case Cancer: 33 System.out.println("牡牛座"); 34 break; 35 36 case Leo: 37 System.out.println("獅子座"); 38 break; 39 40 case Virgo: 41 System.out.println("乙女座"); 42 break; 43 44 case Libra: 45 System.out.println("天秤座"); 46 break; 47 48 case Scorpio: 49 System.out.println("蠍座"); 50 break; 51 52 case Sagittarius: 53 System.out.println("射手座"); 54 break; 55 56 case Capricorn: 57 System.out.println("山羊座"); 58 break; 59 60 case Aquarius: 61 System.out.println("水瓶座"); 62 break; 63 64 case Pisces: 65 System.out.println("魚座"); 66 break; 67 68 } 69 70 } 71} 72

該当のソースコード

java

1public enum Constellation { 2 3 4 Aries("牡羊座",3/21,4/19), 5 Taurus("牡牛座", 4/20, 5/20), 6 Gemini("双子座", 5/21, 6/21), 7 Cancer("蟹座", 6/22, 7/22), 8 Leo("獅子座", 7/23, 8/22), 9 Virgo("乙女座", 8/23, 9/22), 10 Libra("天秤座", 9/23, 10/23), 11 Scorpio("蠍座", 10/24, 11/22), 12 Sagittarius("射手座", 11/23, 12/21), 13 Capricorn("山羊座", 12/22, 1/19), 14 Aquarius("水瓶座", 1/20, 2/18), 15 Pisces("魚座", 2/19, 3/20); 16 17 private String name; 18 private int startDay; 19 private int endDay; 20 21 public String getName() { 22 return name; 23 } 24 25 public void setName(String name) { 26 this.name = name; 27 } 28 29 public int getStartDay() { 30 return startDay; 31 } 32 33 public void setStartDay(int startDay) { 34 this.startDay = startDay; 35 } 36 37 public int getEndDay() { 38 return endDay; 39 } 40 41 public void setEndDay(int endDay) { 42 this.endDay = endDay; 43 } 44 45 Constellation(String string, int i, int j) { 46 47 } 48 49 public void getType(int year,int month,int day) { 50 51 } 52} 53 54

試したこと

教本を買って読んだり、ネットでの検索を行いました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

m.ts10806

2021/06/02 11:27

>教本を買って読んだり、ネットでの検索を行いました。 もっと詳しく記載してください。 間違ってる情報を元にしたり、正しく理解できていなければやりたいことはできません。あと現状何が起きてるんでしょうか。
dodox86

2021/06/02 11:47

> enumの使い方が上手く応用できません。 具体的にどうしたいのかを示しましょう。enumを使い、どういう操作をしてどういう結果を得たいのか質問文とコードからは分かりづらいように思います。
dodox86

2021/06/02 11:57

入力された月日で星座を判定し、該当の星座の名前を出力することが目的ならば、enumは無理に使わず、単に文字列(String)で出力してしまっても良いはずです。それを押してご自身の課題としてenumを使いたいのであれば、どういう操作をしたいのか詳細を示しましょう。「エスパー回答」と称して回答者が勝手に想像、補間して回答することはできますが、それが質問者さんのご要望に沿うとは限りません。そしてそのような場合、大抵、質問回答が長引きます。
guest

回答2

0

ベストアンサー

enumの使い方の応用に着目するのは、とても素晴らしいと思います。
特に何も考えずにifをダラダラと並べる人がとても多いからです。

今、提示されているコードも、このダラダラに該当していますので、
あまりenumを使っている意味がない感じになっています。switchを消し去りたいです。

星座は12種類固定であり、今後も増減する可能性は極めて低いため、
このようにダラダラと書いていてもさほど影響することはないですが、
将来的に増えたり減ったりする可能性があるものをifswitchで条件分岐しちゃうのは、
大変イケてないコードですので、ダラダラ条件分岐をしたくなったら、一旦立ち止まって考えましょう。
以下を参考にしてみてください。

ただし、このままでは、日付として存在しない数字が入力された場合にエラーが起きますので、
その辺りのチェックを入れると、より実用性のあるコードになりますね。

Java

1import java.util.Scanner; 2 3public class Main { 4 public static void main(String[] args) throws Exception { 5 try (Scanner scanner = new Scanner(System.in)) { 6 System.out.println("**********星座判定**********"); 7 System.out.println("誕生年を入力してください (例:1998->1998)"); 8 int year = scanner.nextInt(); 9 System.out.println("誕生月を入力してください (例:11月->11)"); 10 int month = scanner.nextInt(); 11 System.out.println("誕生日を入力してください (例:22日->22)"); 12 int day = scanner.nextInt(); 13 14 System.out.println(year + "年" + month + "月" + day + "日生まれのあなたの星座は" + Constellation.of(month, day).getName() + "です"); 15 } 16 } 17}

Java

1import java.time.MonthDay; 2import java.util.Arrays; 3 4public enum Constellation { 5 6 Aries("牡羊座", 3, 21, 4, 19), 7 Taurus("牡牛座", 4, 20, 5, 20), 8 Gemini("双子座", 5, 21, 6, 21), 9 Cancer("蟹座", 6, 22, 7, 22), 10 Leo("獅子座", 7, 23, 8, 22), 11 Virgo("乙女座", 8, 23, 9, 22), 12 Libra("天秤座", 9, 23, 10, 23), 13 Scorpio("蠍座", 10, 24, 11, 22), 14 Sagittarius("射手座", 11, 23, 12, 21), 15 Capricorn("山羊座", 12, 22, 1, 19), 16 Aquarius("水瓶座", 1, 20, 2, 18), 17 Pisces("魚座", 2, 19, 3, 20); 18 19 private String name; 20 private MonthDay startDay; 21 private MonthDay endDay; 22 23 Constellation(String name, int startMonth, int startDay, int endMonth, int endDay) { 24 this.name = name; 25 this.startDay = MonthDay.of(startMonth, startDay); 26 this.endDay = MonthDay.of(endMonth, endDay); 27 } 28 29 /** 30 * 指定された月と日から、該当するConstellationを返します。 31 * 32 * @param month33 * @param dayOfMonth34 * @return Constellationのいずれか 35 */ 36 public static Constellation of(int month, int dayOfMonth) { 37 MonthDay targetDay = MonthDay.of(month, dayOfMonth); 38 return Arrays.stream(Constellation.values()) 39 .filter(constellation -> !(constellation.startDay.isAfter(targetDay) || constellation.endDay.isBefore(targetDay))) 40 .findFirst() 41 .orElseThrow(IllegalArgumentException::new); 42 } 43 44 public String getName() { 45 return name; 46 } 47}

投稿2021/06/02 13:51

編集2021/06/02 13:55
root_jp

総合スコア4666

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

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

koutarou55478

2021/06/07 00:09

なるほど・・・コードを書くのに精一杯で、 将来的なことはあまり考えておりませんでした。 有効的に使用できるよう頑張ります。 回答していただき、誠にありがとうございました。
guest

0

列挙型Constellationのコンストラクタはこう定義されている。

java

1 Constellation(String string, int i, int j) { 2 3 }

コンストラクタでは何もしていないので、列挙型Constellationのインスタンス変数は、初期値のまま。それぞれ、null, 0, 0。

java

1 private String name; 2 private int startDay; 3 private int endDay;

また、コンストラクタ呼び出しの第二第三引数にも問題があるのではないかと。

java

1 Aries("牡羊座",3/21,4/19)

3/214/19は、日付、月日のつもりなのでしょうが、3/21は、3を21で割った結果なので、ゼロ。同様に4/19も、ゼロ。
コンストラクタに何かを書いたとしても、動きはしないでしょうね。

投稿2021/06/02 11:53

shiketa

総合スコア4061

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問