如何将带有重写的toString()的枚举的字符串结果转换回枚举?

时间:2008-10-27 14:44:24

标签: java enums enumeration converter

给出以下java enum:

public enum AgeRange {

   A18TO23 {
        public String toString() {        
            return "18 - 23";
        }
    },
   A24TO29 {
        public String toString() {        
            return "24 - 29";
        }
    },
   A30TO35 {
        public String toString() {        
            return "30 - 35";
        }
    },

}

有没有办法将字符串值“18 - 23”转换为相应的枚举值,即AgeRange.A18TO23?

谢谢!

6 个答案:

答案 0 :(得分:30)

最好也是最简单的方法就是这样:

public enum AgeRange {
    A18TO23 ("18-23"),
    A24TO29 ("24-29"),
    A30TO35("30-35");

    private String value;

    AgeRange(String value){
        this.value = value;
    }

    public String toString(){
        return value;
    }

    public static AgeRange getByValue(String value){
        for (final AgeRange element : EnumSet.allOf(AgeRange.class)) {
            if (element.toString().equals(value)) {
                return element;
            }
        }
        return null;
    }
}

然后您只需要调用getByValue()方法并输入String

答案 1 :(得分:7)

你总是可以创建一个从字符串到值的映射 - 静态地这样做,所以你只需要映射一次,假设返回的字符串随时间保持不变。据我所知,没有任何内置功能。<​​/ p>

答案 2 :(得分:4)

根据有效的java(第2版)第30项,它可以(它比循环快得多)

public enum AgeRange {
       A18TO23("18-23"),
       A24TO29("24-29"),
       A30TO35("30-35");

       private final String value;

       AgeRange(String value){
          this.value = value;
       }

       @Override public String toString(){
           return value;
       }

       private static final Map<String, AgeRange> stringToEnum =
           new HashMap<String, AgeRange>();

       static {
           for (AgeRange r : values()) {
               stringToEnum.put(r.toString(), r);
           }
       }

       public static AgeRange getByValue(String value){
           return stringToEnum.get(value);
       }
}

答案 3 :(得分:2)

for (AgeRange ar: EnumSet.allOf(AgeRange)) {
    if (ar.toString().equals(inString)) {
         myAnswer = ar;
         break;
    }
}

或类似的东西?刚输入,没有运行编译器。原谅(评论)错别字......

或者使用这样的逻辑来构建一次地图。避免在运行时迭代。好主意,乔恩。

答案 4 :(得分:2)

该类重写“toString()” - 因此,要获得相反的操作,您需要覆盖valueOf()以将toString()的输出转换回枚举值。

public enum AgeRange {

   A18TO23 {
        public String toString() {        
                return "18 - 23";
        }
        public AgeRange valueOf (Class enumClass, String name) {
                return A18T023
        }
    },

    .
    .
    .
}

买家要小心 - 未经编译且未经测试......

toString()valueOf()的机制是API

的文档部分

答案 5 :(得分:0)

您可以尝试以下内容吗?

static AgeRange fromString(String range) {
    for (AgeRange ageRange : values()) {
        if (range.equals(ageRange.toString())) {
            return ageRange;
        }
    }
    return null;   
}

或者,正如其他人所建议的,使用缓存方法:

private static Map<String, AgeRange> map;

private static synchronized void registerAgeRange(AgeRange ageRange) {
    if (map == null) {
        map = new HashMap<String, AgeRange>();
    }
    map.put(ageRange.toString(), ageRange);
}

AgeRange() {
    registerAgeRange(this);
}

static AgeRange fromString(String range) {
    return map.get(range);
}