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