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

给出以下java枚举:

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?

谢谢!

最好和最简单的方法是这样的:

 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; } } 

然后你只需要调用带有String输入的getByValue()方法。

您总是可以创建从字符串到值的映射 – 静态地这样做,因此您只需要映射一次,假设返回的字符串随时间保持不变。 据我所知,没有任何内置内置function。

根据有效的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 stringToEnum = new HashMap(); static { for (AgeRange r : values()) { stringToEnum.put(r.toString(), r); } } public static AgeRange getByValue(String value){ return stringToEnum.get(value); } } 
 for (AgeRange ar: EnumSet.allOf(AgeRange)) { if (ar.toString().equals(inString)) { myAnswer = ar; break; } } 

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

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

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

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

买家要小心 – 未经编译且未经测试……

toString()valueOf()的机制是API的文档部分

你可以试试下面这样的东西吗?

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

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

 private static Map map; private static synchronized void registerAgeRange(AgeRange ageRange) { if (map == null) { map = new HashMap(); } map.put(ageRange.toString(), ageRange); } AgeRange() { registerAgeRange(this); } static AgeRange fromString(String range) { return map.get(range); }