簡體   English   中英

枚舉和字符串之間的映射?

[英]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)

應該管用。


或者嘗試使用enumordinal()方法。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM