Java 如何根据值查找枚举?
我正在使用一个(遗留的,不可更改的)枚举,如下所示:Java 如何根据值查找枚举?,java,enums,Java,Enums,我正在使用一个(遗留的,不可更改的)枚举,如下所示: enum MsgEnum { private int number; private int msg; MSG_OK("OK", 0); MSG_NOK("NOK, 1); //lots of other messages private MsgEnum(String msg, int number) { this.msg = msg; this.number = number;
enum MsgEnum {
private int number;
private int msg;
MSG_OK("OK", 0);
MSG_NOK("NOK, 1);
//lots of other messages
private MsgEnum(String msg, int number) {
this.msg = msg;
this.number = number;
}
}
如果我有编号
,我如何才能最好地找出哪个MsgEnum
与编号匹配(假设它们是唯一的)
除了以下几点,还有更好的方法吗
class MyEnumHelper() {
public static MsgEnum MsgEnumfromNumber(int number) {
for (MsgEnum m : MsgEnum.values()) {
if (m.getNumber() == number) {
return m;
}
}
return null;
}
}
您可以在助手中声明静态映射,并使用静态方法getMsgEnumFromInteger(int)访问它。比如:
private static final Map<Integer, MsgEnum> INT_TO_ENUM = new HashMap<Integer, MsgEnum>();
static {
for (MsgEnum msgE : MsgEnum.values) {
INT_TO_ENUM.put(msgE.getNumber(), msgE);
}
}
public static MsgEnum getByInt(int number) {
return INT_TO_ENUM.get(number);
}
private static final Map INT_TO_ENUM=new HashMap();
静止的{
for(MsgEnum msgE:MsgEnum.values){
INT_TO_ENUM.put(msgE.getNumber(),msgE);
}
}
公共静态MsgEnum getByInt(整数编号){
将INT_返回给_ENUM.get(number);
}
(很抱歉,如果出现错误,它目前没有Java环境^^)您可以在助手中声明静态映射,并使用静态方法getMsgEnumFromInteger(int)访问它。比如:
private static final Map<Integer, MsgEnum> INT_TO_ENUM = new HashMap<Integer, MsgEnum>();
static {
for (MsgEnum msgE : MsgEnum.values) {
INT_TO_ENUM.put(msgE.getNumber(), msgE);
}
}
public static MsgEnum getByInt(int number) {
return INT_TO_ENUM.get(number);
}
private static final Map INT_TO_ENUM=new HashMap();
静止的{
for(MsgEnum msgE:MsgEnum.values){
INT_TO_ENUM.put(msgE.getNumber(),msgE);
}
}
公共静态MsgEnum getByInt(整数编号){
将INT_返回给_ENUM.get(number);
}
(很抱歉,如果有错误,它目前没有Java环境^)构建从值到枚举的映射?用户可以使用Olivier.Roger的建议答案,也可以保留for循环。如果数字是从0到N的算术级数,则可以使用枚举的序号:MyEnum.values()[number]。否则,地图建议是一个很好的选择one@GilMoshayof我不同意。这不是在Java中做这类事情的方式。这是错误的做法。查看已接受的答案。@GilMoshayof it's write”//lots other messages“就在作为示例给出的2个枚举值后面^^构建一个从值到枚举的映射?用户可以使用Olivier.Roger的建议答案,也可以保留for循环。如果数字是从0到N的算术级数,则可以使用枚举的序号:MyEnum.values()[number]。否则,地图建议是一个很好的选择one@GilMoshayof我不同意。这不是在Java中做这类事情的方式。这是错误的方法。请参阅公认的答案。@GilMoshayof it's writed”//许多其他消息”就在作为示例给出的2个枚举值后面^^抱歉,我本应该写到枚举位于我想要/必须使用的外部库中,但无法更改。这就是我所说的“遗留”的意思.OK^^那么你可以在助手中声明静态映射:)你能举个例子说明静态映射是什么意思吗?当然是最好的方法,从
O(n)
算法转移到O(1)
算法。+1从技术上讲,这仍然是O(n),因为他无论如何都需要对这些值进行一次迭代。虽然这样可以在以后的调用中节省时间,特别是对于大量的枚举值。很抱歉,我应该写下,枚举位于我想要/必须使用的外部库中,但无法更改。这就是我所说的“遗留”的意思.OK^^那么你可以在助手中声明静态映射:)你能举个例子说明静态映射是什么意思吗?当然是最好的方法,从O(n)
算法转移到O(1)
算法。+1从技术上讲,这仍然是O(n),因为他无论如何都需要对值进行一次迭代。尽管这样可以在以后的调用中节省时间,尤其是对于大量的枚举值。