1

ハッシュマップに問題があります。現在、私の HashMap は、 またはNamesのキーを使用して、と呼ばれる列挙型の HashMap です。現在、Name Enum には KeySignatures または. 特定の KeySignature の Enum バージョンを取得するために、上記で説明した HashMap を作成しました。Key SignaturesHashMap<KeySignature, Names>C_FLAT_MAJOR(new KeySignature(7, Accidental.FLAT, Scale.MAJOR);

private static final HashMap<KeySignature, Names> lookup = new HashMap<KeySignature, Names>();
static {
    for (Names name : Names.values()){
    lookup.put(new KeySignature(name.getKeySig()), name);

    }
}

そのため、KeySignature の Enum バージョンを確認する必要がある場合は、KeySignature クラスにあるメソッドを呼び出します。

public Names getCommonName() {
    return Names.lookup.get(this);

    }

ただし、返される値は常に null です。

これの原因はわかりませんが、HashMap.get()メソッドが値ではなく参照によってキーと引数を比較しているようです。KeySignature の .equals および .hash メソッドをオーバーライドする必要がありますか、それとも完全に間違った方向を見ているのでしょうか?

4

1 に答える 1

3

答えはイエスです。

KeySignatureのインスタンスをその場で作成する場合、equalsメソッドはそれらを「値で」比較する必要があります。のデフォルトの実装は、equals単にオブジェクトが==. したがって、ハッシュマップを機能させる必要があり、デフォルトのequalsANDhashcodeメソッドをオーバーライドする必要があります。

もう 1 つの方法は、新しいインスタンスを作成するコードを、ノート、Accidental、Scale の特定の組み合わせのKeySignature既存のインスタンスを検索する代替コードに置き換えることです。KeySignature

于 2013-05-14T10:42:37.250 に答える