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

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

ただいまの
回答率

90.61%

  • Java

    13499questions

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

  • コンストラクタ

    28questions

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

JavaのEnumMapの使い方について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 293

kino92

score 1

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>に変換できません:)

該当のソースコード

0. package sample21;
1. import java.util.EnumMap;
2. 
3. public class SoundMapList {
4. 
5.     private enum Sound{
6.       C,C_,D,D_,
7.       E,F,F_,G,
8.       G_,A,A_,B;
9.     }
10. 
11.     private EnumMap<Sound,Integer> SoundMap;
12. 
13.     public SoundMapList(){
14.         SoundMap = new EnumMap<Sound,Integer>(SoundMapList.class);
15. 
16.         SoundMap.put(Sound.C,1);
17.         SoundMap.put(Sound.C_,2);
18.         SoundMap.put(Sound.D,3);
19.         SoundMap.put(Sound.D_,4);
20.         SoundMap.put(Sound.E,5);
21.         SoundMap.put(Sound.F,6);
22.         SoundMap.put(Sound.F_,7);
23.         SoundMap.put(Sound.G,8);
24.         SoundMap.put(Sound.G_,9);
25.         SoundMap.put(Sound.A,10);
26.         SoundMap.put(Sound.A_,11);
27.         SoundMap.put(Sound.B,12);
28.       }
29. 
30. 
31. }

試したこと

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

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

java 1.8.0_152
java(TM) SE Runtime Enviroment (build 1.8.0_152-b16)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • swordone

    2018/01/13 20:25 編集

    CLI→CUI(Character User Interface)?

    キャンセル

  • kino92

    2018/01/13 21:26

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

    キャンセル

  • swordone

    2018/01/13 21:28

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

    キャンセル

  • kino92

    2018/01/13 21:39

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

    キャンセル

回答 1

checkベストアンサー

+4

こんにちは

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

修正前:

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

修正後:

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

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


追記

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

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

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

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

import java.util.Map;
import java.util.EnumMap;
import java.util.Set;

class SoundMapList {

    private enum Sound {
        C,C_,D,D_,E,F,F_,G,G_,A,A_,B;

        int value() {
            return this.ordinal() + 1;
        }
    }

    private Map<Sound,Integer> soundMap;

    public SoundMapList() {
        soundMap = new EnumMap<>(Sound.class);

        for (Sound s: Sound.values()) {
            soundMap.put(s, s.value());
        }
    }

    public Map<Sound,Integer> getMap() {
        return soundMap;
    }
}

public class Main {
    public static void main(String[] args) {
        SoundMapList soundMapList = new SoundMapList();
        Set set = soundMapList.getMap().entrySet();
        System.out.println(set);
    }
}


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

[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 17:56 編集

    >質問者さん
    「#」についてですが、文法的には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さん

    キャンセル

  • 2018/01/13 18:00

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

    キャンセル

  • 2018/01/13 18:55

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

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    JAVAに関する質問

    JAVAに関する質問です。 JAVAで以下のプログラムを作成しました。 import java.util.Scanner;  public class Sample {  /

  • 解決済

    2番目の最大値の求め方

    javaを学習し始めで不明な個所がありますので、質問させていただきます。 4つの数値があり、それぞれを比較し2番目の最大値を取得するプログラムを作成したいと思っています。同じ

  • 解決済

    メソッドを使ったプログラムを作りたいです

    前提・実現したいこと Javaのメソッドを使う問題を解いています。 問題は以下の通りです。 ↓ 好物を元に動物の名前と特徴を出力するプログラム  ・作成するクラス 

  • 解決済

    ヒストグラムのプログラムをつくっていますがデータのカウントが上手くいきません

    得点の10点刻みの分布をつくっています。乱数のプログラムから乱数を読みこむ形です。乱数のプログラムとはパイプでつなぐので、そこは問題なくできています。 以下は私がつくったプログラ

  • 解決済

    Javaで、条件に合致する文字列を並べ替える

    Javaで、Mapに格納された以下の例のような文字列 (例) キー データ(文字列) 1 /a/b/c/d/e 2     /a/b/c/d/f 3     /a/b

  • 解決済

    Java map使い方、書き方

    数値、 文字列 日付を持ったクラスを 数値をキーにmapでこのクラスのデータを 保持するには どうすれば実現できますか。 簡単な質問で失礼します。

  • 解決済

    マップインタフェースのオーバーライド?

    import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import

  • 解決済

    javaクラスの初歩的な質問

    下記の様な簡単な抽象クラスを作りました。 文字列に接頭語、接尾語を追加するクラスになります。 この例では、抽象関数doExecの戻り値は文字列型ですが、違う変数型でも返したい場

同じタグがついた質問を見る

  • Java

    13499questions

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

  • コンストラクタ

    28questions

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