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

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

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

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

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

Q&A

解決済

1回答

4457閲覧

JavaのEnumMapの使い方について

kino92

総合スコア7

Java

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

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

0グッド

0クリップ

投稿2018/01/13 07:50

Java初心者です。

音楽の音階をとりあえずCLIで操作したいと思い、
音階の基礎となるクラスを生成したいんですが…
コンストラクタの引数がエラーとして吐かれてうまくいきません。
どんな風に直せばいいのか。それとEnumMapとはライブラリクラスという理解で
いいのか否かを教えていただけませんか?

もう一つお願いします。
”#”はjavaでは文字列として使えないんですか?特殊文字として処理されてしまって。
音階を文字で表示したいので”#”が使えると便利なのですが…使えるようにするにはどんな風に記述すればいいのですか?”¥”を表示したければ”¥¥”と記述すれば良いなどの記事は見たのですが”#”はできないのでしょうか。

###発生している問題・エラーメッセージ

エラーメッセージ SoundMapList.java:16: エラー: EnumMapに適切なコンストラクタが見つかりません(Class<SoundMapList>) SoundMap = new EnumMap<Sound,Integer>(SoundMapList.class); ^ コンストラクタ EnumMap.EnumMap(Class<Sound>)は使用できません (引数の不一致: Class<SoundMapList>をClass<Sound>に変換できません:) コンストラクタ EnumMap.EnumMap(EnumMap<Sound,? extends Integer>)は使用できません (引数の不一致: Class<SoundMapList>をEnumMap<Sound,? extends Integer>に変換できません:) コンストラクタ EnumMap.EnumMap(Map<Sound,? extends Integer>)は使用できません (引数の不一致: Class<SoundMapList>をMap<Sound,? extends Integer>に変換できません:)

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

Java

10. package sample21; 21. import java.util.EnumMap; 32. 43. public class SoundMapList { 54. 65. private enum Sound{ 76. C,C_,D,D_, 87. E,F,F_,G, 98. G_,A,A_,B; 109. } 1110. 1211. private EnumMap<Sound,Integer> SoundMap; 1312. 1413. public SoundMapList(){ 1514. SoundMap = new EnumMap<Sound,Integer>(SoundMapList.class); 1615. 1716. SoundMap.put(Sound.C,1); 1817. SoundMap.put(Sound.C_,2); 1918. SoundMap.put(Sound.D,3); 2019. SoundMap.put(Sound.D_,4); 2120. SoundMap.put(Sound.E,5); 2221. SoundMap.put(Sound.F,6); 2322. SoundMap.put(Sound.F_,7); 2423. SoundMap.put(Sound.G,8); 2524. SoundMap.put(Sound.G_,9); 2625. SoundMap.put(Sound.A,10); 2726. SoundMap.put(Sound.A_,11); 2827. SoundMap.put(Sound.B,12); 2928. } 3029. 3130. 3231. }

###試したこと
ここの変数名をとりあえず変えてみたのコンパイルしてみたのですが・・
7ステップで理解するJavaでの列挙型/enum使用法 (3/3)

###補足情報(言語/FW/ツール等のバージョンなど)
java 1.8.0_152
java(TM) SE Runtime Enviroment (build 1.8.0_152-b16)

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

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

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

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

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

swordone

2018/01/13 12:09 編集

CLI→CUI(Character User Interface)?
kino92

2018/01/13 12:26

あ、Command Line Interface だと思ってました笑 おそらくそっちです笑
swordone

2018/01/13 12:28

いま調べたらCLIもありました…無知でした
kino92

2018/01/13 12:39

いえ!お気になさらず!! わざわざ指摘していただいただけでも嬉しいです。どっちが正しいと説明できないので笑 もっと勉強しようと励みになりました。ありがとうございました。
guest

回答1

0

ベストアンサー

こんにちは

以下の修正をすると意図通りに動作すると思います。

修正前:

java

1SoundMap = new EnumMap<Sound,Integer>(SoundMapList.class);

修正後:

java

1SoundMap = new EnumMap<Sound,Integer>(Sound.class);

以上参考になれば幸いです。


追記

以下の点で、リファクタしてみました。

  • new EnumMap<Sound,Integer>(Sound.class) は、 new EnumMap<>(Sound.class) と略せる。(java 1.6 以上)

  • enum にはメソッドを定義でき、また、ordinal()メソッドで先頭要素を 0 とする序数(配列のインデクスのようなもの)を得られる。

上記を用いると、以下のように書けます。

java

1import java.util.Map; 2import java.util.EnumMap; 3import java.util.Set; 4 5class SoundMapList { 6 7 private enum Sound { 8 C,C_,D,D_,E,F,F_,G,G_,A,A_,B; 9 10 int value() { 11 return this.ordinal() + 1; 12 } 13 } 14 15 private Map<Sound,Integer> soundMap; 16 17 public SoundMapList() { 18 soundMap = new EnumMap<>(Sound.class); 19 20 for (Sound s: Sound.values()) { 21 soundMap.put(s, s.value()); 22 } 23 } 24 25 public Map<Sound,Integer> getMap() { 26 return soundMap; 27 } 28} 29 30public class Main { 31 public static void main(String[] args) { 32 SoundMapList soundMapList = new SoundMapList(); 33 Set set = soundMapList.getMap().entrySet(); 34 System.out.println(set); 35 } 36}

上記を実行すると、以下が出力されます。

[C=1, C_=2, D=3, D_=4, E=5, F=6, F_=7, G=8, G_=9, A=10, A_=11, B=12]

投稿2018/01/13 08:15

編集2018/01/13 08:55
jun68ykt

総合スコア9058

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

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

KSwordOfHaste

2018/01/13 08:58 編集

>質問者さん 「#」についてですが、文法的にはenumの値はJavaの「識別子」であって「文字列」とは呼びません。識別子に使える文字は決まっておりましてとても大雑把に言えば「記号や数字ではない普通の文字」だと思ってください。アンダーバーだって'$'だって記号なのに使えるじゃないかというツッコミが聞こえてきそうですがあくまで「大雑把」な話です。しかしjavaの文法仕様にはその点がちゃんと書いてあります。#は識別子には使えない文字に分類されているので半角・全角ともに識別子としては使えません。 jun68yktさん回答にあるようにenumは普通のクラスと同様メソッドを定義できるのでこんな芸当もできます。プログラム上はあくまでアンダーバーつきの名前が識別子なのですが、System.out.printlnなどで印字するときだけはC#などと印字するようにできるわけです。入力した文字列をenumへ翻訳する際にはenum.valueOfはオーバーライド不能なので、自前で別のメソッドを書いてやる必要がありますが・・・ enum Key { C,C_,D,D_,E,F,F_,G,G_,A,A_,B; @Override String toString() { return name().replace("_", "#"); } int value() { return this.ordinal() + 1; } } 回答内容と直接関係しないコメントですがご容赦を。>jun68yktさん
jun68ykt

2018/01/13 09:00

KSwordOfHaste さん、フォローありがとうございます!
kino92

2018/01/13 09:55

なるほど。つっかえてた疑問が解決しました!お二人ともありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問