给出以下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?
谢谢!
答案 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);
}