枚举和字符串之间的映射?

时间:2012-01-02 22:21:33

标签: java enums

所以,我最近阅读this post,我想做同样的事情。

我并不真正关心“丑陋”等等所以我实现了其中一种方法:

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)

它说它们是不兼容的类型。我该怎么做才能解决它?

2 个答案:

答案 0 :(得分:2)

使用if ( id == dTemp.id )。枚举是类,枚举值是不是整数的对象,因此不能对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()缓存在私有静态变量中,然后访问该缓存的数组。

顺便问一下,你在问题中提到的字符串在哪里?

答案 1 :(得分:1)

if(id == dTemp.id)

应该工作。


或者尝试使用ordinal()的{​​{1}}方法。

  

public final int ordinal()返回此枚举常量的序号(它在枚举声明中的位置,其中初始常量的序数为零)。大多数程序员都没有使用这种方法。它设计用于复杂的基于枚举的数据结构,例如EnumSet和EnumMap。

     

返回:   这个枚举常数的序数。 See


好吧,我复制了你的代码并进行了相应的测试。

两者

enum

if (id == dTemp.ordinal()+1)

工作正常并按预期生产。声明

if(id == dTemp.id)

产生星期一