[英]Mapping between an enum and a string?
因此,我最近閱讀了這篇文章,並且我想有效地做同樣的事情。
我並不真正關心“丑陋”等等所以我實現了這樣的方法之一:
public enum Day {
Monday(1),
Tuesday(2),
Wednesday(3),
Thursday(4),
Friday(5),
Saturday(6),
Sunday(7);
public final int id;
Day(int id) {
this.id = id;
}
public static Day getByID(int id) {
Day d = null;
for (Day dTemp : Day.values())
{
if (id == dTemp)
{
d = dTemp;
break;
}
}
return d;
}
public Day getNext() {
return values()[(ordinal()+1)%values().length];
}
public Day getPrev() {
return values()[(ordinal()-1)%values().length];
}
}
但是,當我這樣做時,它的問題出在if語句中:
if (id == dTemp)
它說它們是不兼容的類型。 我該怎么做才能解決這個問題?
使用if ( id == dTemp.id )
。 枚舉是類,而枚舉值是不是int的對象,因此不能(顯式或隱式)轉換為int
。
另外,請注意,枚舉具有序數,即其位置的id。 在您的示例中, Monday
將具有序數0,而Sunday
將具有序數6.您可以通過調用ordinal()
方法來訪問序號。
因此,如果id
是基於一個的,則可以改為執行以下操作:
public static Day getByID(int id) {
//check id is between 1 and 7, I'll leave that for you
return Day.values()[id - 1];
}
請注意,您可能想將Day.values()
緩存在私有靜態變量中,然后訪問該緩存的數組。
順便說一句,您在問題中提到的字符串在哪里?
if(id == dTemp.id)
應該管用。
或者嘗試使用enum
的ordinal()
方法。
public final int ordinal()返回此枚舉常量的序數(其在枚舉聲明中的位置,其中初始常量的序數為零)。 大多數程序員都沒有使用這種方法。 它設計用於復雜的基於枚舉的數據結構,例如EnumSet和EnumMap。
返回:此枚舉常量的序數。 見 。
好吧,我復制了你的代碼並做了相應的測試。
都
if (id == dTemp.ordinal()+1)
和
if(id == dTemp.id)
工作正常並按預期生產。 該聲明
System.out.println(Day.Friday.getByID(1));
產生星期一 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.