Java中枚举文本的序号

时间:2011-06-03 10:44:34

标签: java enumeration

鉴于以下定义:

public enum SampleEnum1 { Uno, Dos, Tres }
public enum SampleEnum2 { One, Two, Three, Four }

我需要两种方法:

  • 给定整数2,如果应用于Dos则返回SampleEnum1Two如果应用于SampleEnum2
  • 给定值One,返回1

实际上我需要在枚举定义中将枚举文本转换为序列号,反之亦然。

我不介意使用泛型,反射或其他任何东西,只要相同的2种方法适用于任何枚举。

你有解决方案吗?

3 个答案:

答案 0 :(得分:1)

如果你可以确保在源文件中按顺序保存你的枚举,你可以这样做以按编号获取枚举:

public static SampleEnum1 getSpanishEnum(int index) {
    return SampleEnum1.values()[index - 1];
}

public static SampleEnum2 getEnglishEnum(int index) {
    return SampleEnum2.values()[index - 1];
}

另一方面,你可以做一个循环

public static <E extends Enum> getEnumIndex(E value, E[] values) {
    for(int i = 0; i < values.length; i++) {
        if(value == values[i]) {
            return i + 1;
        }
    }
    throw new NoSuchElementException();
}

这样称呼它:

getEnumIndex(SampleEnum1.Dos, SampleEnum1.values());

答案 1 :(得分:1)

另一种方法是使用辅助方法,如

public static <E etxends Enum<E>> E lookup(Class<E> eClass, int number) {
     return eClass.getEnumConstants()[number-1];
}

SampleEnum1 se1 = lookup(SampleEnum1.class, 2);

BTW:你可以从Zero开始,这也会简化你的代码。

答案 2 :(得分:1)

可以使用Class.getEnumConstants()方法完成前进方向:

  public static <E extends Enum<E>> E getValue(Class<E> eClass, int index) { 
      return eClass.getEnumConstants()[index - 1];
  }

如下所示:

  SampleEnum2 two = getValue(SampleEnum2.class, 2);

(不幸的是,我们不能编写一个使用每个values()所拥有的enum方法的泛型方法。它是静态的,因此我们无法通过多态调度来访问它。反过来访问它我们需要知道实际的E类......这需要一个Class<E>对象。如果你必须通过它,你也可以调用它的getEnumConstants方法。 )


反方向更简单:

  public static <E extends Enum<E>> int getIndex(E e) { 
      return e.ordinal() + 1; 
  }

当然,如果按照正常的IT约定,集合的索引从零开始,则更为简洁。