0

まず、私のコード(完璧にはほど遠いです。自分が何をしているのかよくわかりません)は次のとおりです。

   public enum Chord { MAJOR, MINOR, DIMINISHED, BASS, BASS2 }
   public enum Scales { C, D, E, F, G, A }
public class EnumTest
{
Chord chord;
public EnumTest(Chord chord)
{
    this.chord = chord;
}
public void tellItLikeItIs()
{

switch (chord) {

    case MAJOR:
            for(Scales C : Scales.values())
                System.out.println(C + " " + C.ordinal());
                break;

//I've tried in the CHORD enum going MAJOR(0, 2, 4) but I don't think that was correct
    case MINOR: System.out.println("C, Eb, G");
                break;
    default:
        System.out.println("I screwed up");
        break;

}
}


public static void main(String[] args)
{

EnumTest firstDay = new EnumTest(Chord.MAJOR);
firstDay.tellItLikeItIs();
EnumTest thirdDay = new EnumTest(Chord.MINOR);
thirdDay.tellItLikeItIs();
System.out.println("Here are all Scale degrees" +
                   " and their ordinal values: ");
for(Scales C : Scales.values())
  System.out.println(C + " " + C.ordinal());



}

}

いくつかの角かっこなどが欠落している可能性があります。コードツールを使用してその一部を投稿するのに問題がありました。私の質問は、MAJORの場合、C、E、G(0、2、4)のみを出力することを除いて、コンパイラにC 0、D 1、E2などを出力させることができるということです。メジャーコードに対してこれらの3つの順序値のみを選択し、それらを印刷する方法はありますか?

また、Scales列挙型では、シャープが「違法な文字」であり、エスケープ文字を調べようとしたことを除いて、シャープ(C、C#、D、D#..)も必要ですが、_MusicChord\Scales.java:2: illegal character: \35どちらも記事を理解していませんでした読んだか、間違ったものを見ていました。誰かが#を違法な文字にせずにScalesクラスに追加する方法を教えてもらえますか?どんな助けでも大歓迎です

4

5 に答える 5

2

次の例では、直面している問題のいくつかにどのように対処できるかを確認できます。

public class EnumTest
{
    public enum Chord
    {
        MAJOR,
        MINOR,
        DIMINISHED,
        BASS,
        BASS2
    }

    public enum Scales
    {
        C("C"),
        CSharp("C#"),
        E("E"),
        F("F"),
        G("G"),
        A("A");

        private final String printName;

        Scales(String printName)
        {
            this.printName = printName;
        }

        public String getPrintName()
        {
            return printName;
        }

        public String toString()
        {
            return printName;
        }

        private static final Map<Chord, List<Scales>> scalesForChord;

        static
        {
            scalesForChord = new HashMap<Chord, List<Scales>>();

            scalesForChord.put(Chord.MAJOR, Arrays.asList(Scales.C, Scales.E, Scales.G));
        }

        public static List<Scales> getScalesForChord(Chord chord)
        {
            return scalesForChord.get(chord);
        }
    }
}
于 2011-11-04T13:00:48.113 に答える
1

他の回答に加えて、将来コードを拡張するのが難しくなるため、使用しないでください。 .ordinal()例:列挙型を追加する必要があり、その順序が必要なものではない場合はどうなりますか?

順序は、宣言におけるENUMの「位置」です。あなたの例では、これはあなたのドメインにとって意味的に意味のある何かと偶然に一致します。

ガンダルフの例のように、個々のENUMに対してこれらの値をとるコンストラクターを用意することにより、このセマンティックの重要性に注意を向けることをお勧めします。C("C"),持っている代わりにC("C", 1)、そしてfinal String printName;また持っているfinal String whateverThatNumberMeans;

于 2011-11-04T13:06:27.323 に答える
0

ループ内で列挙型使用if(c.ordinal() == 1)またはそれ以上の関連要素のみを選択します。if(Chord.MAJOR.equals(c))私はあなたの質問を理解したと思います。

2番目の質問はあまり明確ではありません。識別子名の一部として使用したい場合#は無理ではありませんのでご了承ください。このキャラクターは禁止されています。ただし、必要にtoString()応じて実装に使用できます。

これがお役に立てば幸いです。

于 2011-11-04T12:54:42.557 に答える
0

{C、Cs、D、...、A、As、B}を実行します。同様に、{C、Db、D、...、A、Bb、B}を実行することもできます。原則として、[[:alpha:]_][[:alnum:]_]*名前はforに固執します。

于 2011-11-04T12:55:05.483 に答える
0

あなたのケースでこれを試してみてください。

case MAJOR:
            for (Scales c : EnumSet.of(Scales.C, Scales.E, Scales.G)) {
                System.out.println(c + " " + c.ordinal());
            }
            break;

スケール列挙型の場合:

public enum Scales {
    C, Cs("C#"), D, Ds("D#"), E, F, G, A;
    private final String label;
    private Scales() {
        this.label = name();
    }
    private Scales(String label) {
        this.label = label;
    }
    @Override
    public String toString() { return label; }
}
于 2011-11-04T13:12:12.393 に答える