Как выбрать определенный enum.ordinal (), используя другой enum? - PullRequest
0 голосов
/ 04 ноября 2011

Во-первых, мой код (он далек от совершенства, я действительно не знаю, что я делаю) таков:

   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 0, D 1, E 2 и т. Д., За исключением того, что я хочу, чтобы он печатал только C, E и G (0, 2, 4). Есть ли способ выбрать ТОЛЬКО эти 3 порядковых значения для основного аккорда и распечатать их?

Кроме того, в перечислении Scales мне также нужны острые предметы (C, C #, D, D # ..), за исключением того, что острые предметы являются «недопустимыми символами», и я получаю _MusicChord\Scales.java:2: illegal character: \35 Я пытался изучить escape-символы, но я не понял статью, которую я прочитал, или я смотрел не на ту вещь. Может ли кто-нибудь также сказать мне, как добавить # в класс Scales, чтобы они не были недопустимыми символами? Любая помощь приветствуется

Ответы [ 5 ]

2 голосов
/ 04 ноября 2011

В следующем примере вы можете увидеть, как можно решить некоторые проблемы, с которыми вы сталкиваетесь:

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);
        }
    }
}
1 голос
/ 04 ноября 2011

В дополнение к другим ответам, , вы не должны использовать .ordinal(), потому что это затруднит расширение вашего кода в будущем.Пример: что, если вам нужно добавить enum и его порядковый номер не тот, который вам нужен?

Порядковый номер - это «позиция» ENUM в его объявлении. В вашем примере это случайно совпадает с тем, что семантически имеет смысл для вашей области.

Лучше было бы привлечь внимание к этой смысловой важности , имея конструкторыкоторые принимают эти значения для отдельных ENUM, как в примере Гэндальфа.Вместо C("C"), есть C("C", 1), а в дополнение к final String printName; также есть final String whateverThatNumberMeans;

0 голосов
/ 04 ноября 2011

Попробуйте это для вашего случая ОСНОВНЫЕ:

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

и это для вашего перечисления Scales:

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; }
}
0 голосов
/ 04 ноября 2011

Do {C, Cs, D, ..., A, As, B}.Точно так же вы могли бы сделать {C, Db, D, ..., A, Bb, B}.Как правило, придерживайтесь [[:alpha:]_][[:alnum:]_]* для имен.

0 голосов
/ 04 ноября 2011

Чтобы выбрать только соответствующие элементы перечисления, используйте if(c.ordinal() == 1) или лучше if(Chord.MAJOR.equals(c)) в цикле. Надеюсь, я понял ваш вопрос.

Второй вопрос не очень понятен. Если вы хотите использовать # как часть имени идентификатора, пожалуйста, это невозможно. Этот персонаж запрещен. Но вы можете использовать его в toString() реализации, если хотите.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...