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),因为他无论如何都需要对值进行一次迭代。尽管这样可以在以后的调用中节省时间,尤其是对于大量的枚举值。