2011-11-04 62 views
0

首先,我的代碼(這是遠遠不夠完善,我真的不知道我在做什麼)是這樣的:如何使用另一個枚舉選擇特定的enum.ordinal()?

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個主要和絃的序數值並打印這些值?我還需要銳器(C,C#,D,D#..),除了銳器是'非法字符',我得到_MusicChord\Scales.java:2: illegal character: \35我試圖查看轉義字符,但我或者不知道不理解我閱讀的文章,或者我看錯了東西。有人可以告訴我如何將#添加到Scales類中,而不是非法字符?任何幫助表示讚賞

+0

我的原因嘗試使用序號是因爲最終我想將其插入GUI並讓用戶選擇一個音符(A,B,C ..等等..),然後從C標度中偏移該值(例如:C(0)= C(0)E(2)G(4),而D僅僅是C整個偏移1(如果這對所有人都有意義) )我能想到的唯一合理的方式(以及我建議的一種方法)是嘗試使用序號 – cutrightjm

回答

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); 
     } 
    } 
} 
+0

@ekaj來幫助理解甘道夫的答案,認識到使用關鍵字enum來定義您的Enum類大致相當是有幫助的公共類MyEnum繼承java.lang.Enum 。 Java中的枚舉不僅僅是一個「列表持有者」(這是我的第一印象)。請參閱Java API文檔中的文檔,瞭解您可以在枚舉的內部執行哪些操作,等等。http://download.oracle.com/javase/6/docs/api/ –

0

若要選擇僅枚舉使用if(c.ordinal() == 1)或更好if(Chord.MAJOR.equals(c))循環中的相關元素。我希望我能理解你的問題。

第二個問題不是很清楚。如果你想使用#作爲標識符名稱的一部分,請不要這是不可能的。這個角色是被禁止的。但是如果你願意,你可以將它用於toString()實現。

我希望這會有所幫助。

0

做{C,Cs,D,...,A,As,B}。同樣,你也可以做{C,Db,D,...,A,Bb,B}。作爲一項規則,堅持使用[[:alpha:]_][[:alnum:]_]*作爲名稱。

1

除了其他的答案,你不應該使用.ordinal(),因爲它使你的代碼更難在未來擴大。示例:如果您必須添加枚舉並且它的序號不是您所需要的,那該怎麼辦?

序號是ENUM在其聲明中的'位置'。 在您的示例中,這恰好與語義上對您的域有意義的內容重合。

這是一個更好的主意,通過具有在甘道夫例如把這些價值觀對個人枚舉,像構造提請注意這個語義重要性。取而代之的C("C"),C("C", 1),而且除了final String printName;也有final String whateverThatNumberMeans;

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; } 
}