Java 如何将输入字符串与枚举进行比较?
我有我的以下列举-Java 如何将输入字符串与枚举进行比较?,java,enums,Java,Enums,我有我的以下列举- public enum TestEnum { h1, h2, h3, h4; public static String forCode(int code) { return (code >= 0 && code < values().length) ? values()[code].name() : null; } public static void main(String[] args) {
public enum TestEnum {
h1, h2, h3, h4;
public static String forCode(int code) {
return (code >= 0 && code < values().length) ? values()[code].name() : null;
}
public static void main(String[] args) {
System.out.println(TestEnum.h1.name());
String ss = "h1";
// check here whether ss is in my enum or not
}
}
现在我要检查的是给定了一个字符串h1,我需要看看这个字符串h1是否在我的枚举中?如何使用枚举来完成此操作?最简单的方法:
try {
TestEnum.valueOf(ss);
System.out.println("valid");
} catch (IllegalArgumentException e) {
System.out.println("invalid");
}
最简单的方法:
try {
TestEnum.valueOf(ss);
System.out.println("valid");
} catch (IllegalArgumentException e) {
System.out.println("invalid");
}
您应该避免对枚举使用序数。而是给每个枚举常量一个值,并有一个字段
因此,您的枚举应该如下所示:
public enum TestEnum {
h1("h1"), h2("h2"), h3("h3"), h4("h4");
private final String value;
TestEnum(String value) { this.value = value; }
public static TestEnum forValue(String value) {
// You can cache the array returned by `values()` in the enum itself
// Or build a map from `String` to `TestEnum` and use that here
for (TestEnum val: values()) {
if (val.value.equals(value)) {
return val;
}
}
}
}
然后,对于给定的字符串,您可以检查它是否为有效值,如下所示:
String value = "h1";
TestEnum enumValue = TestEnum.forValue(value);
if (enumValue == null) {
System.out.println("Invalid value");
}
您应该避免对枚举使用序数。而是给每个枚举常量一个值,并有一个字段
因此,您的枚举应该如下所示:
public enum TestEnum {
h1("h1"), h2("h2"), h3("h3"), h4("h4");
private final String value;
TestEnum(String value) { this.value = value; }
public static TestEnum forValue(String value) {
// You can cache the array returned by `values()` in the enum itself
// Or build a map from `String` to `TestEnum` and use that here
for (TestEnum val: values()) {
if (val.value.equals(value)) {
return val;
}
}
}
}
然后,对于给定的字符串,您可以检查它是否为有效值,如下所示:
String value = "h1";
TestEnum enumValue = TestEnum.forValue(value);
if (enumValue == null) {
System.out.println("Invalid value");
}
对我来说,为每个枚举设置值似乎没有必要。下面是一个使用toString而不是.value的解决方案,我觉得它更简单一些:
public class tester {
public static void main(String[] args) {
TestEnum enumValue = TestEnum.forValue("X1");
if (enumValue == null) {
System.out.println("Invalid value");
} else {
System.out.println("Good value");
}
}
public enum TestEnum {
X1, X2, X#;
public static TestEnum forValue(String value) {
for (TestEnum val : values())
if (val.toString().equals(value))
return val;
return null;
}
}
对我来说,为每个枚举设置值似乎没有必要。下面是一个使用toString而不是.value的解决方案,我觉得它更简单一些:
public class tester {
public static void main(String[] args) {
TestEnum enumValue = TestEnum.forValue("X1");
if (enumValue == null) {
System.out.println("Invalid value");
} else {
System.out.println("Good value");
}
}
public enum TestEnum {
X1, X2, X#;
public static TestEnum forValue(String value) {
for (TestEnum val : values())
if (val.toString().equals(value))
return val;
return null;
}
}
有什么方法可以用if语句检查来代替这个吗?不……不,不,除非把工作转移到别处。您可以构建枚举名称的静态最终映射,也可以直接在枚举值上循环。@SSH值和valueOf由定义,它们没有定义检查的布尔版本。我认为这是一个有用的功能。我不知道Java8,但他们没有添加这个,是吗?无论如何,如果我不想使用异常,我会循环使用值。谢谢。。还有一件事我刚刚发现,我只需要在枚举中将字符串ss与h1、h2或h3进行比较。。我不需要检查枚举中的h4。。你知道在你当前的例子中如何使用Enum吗?有没有什么方法可以用if语句检查来代替它?不是……不是真的,除非把工作转移到别处。您可以构建枚举名称的静态最终映射,或者直接在枚举值上循环。@SSH值和valueOf由定义,它们没有定义检查的布尔版本。我认为这是一个有用的功能。我不知道Java8,但他们没有添加这个,是吗?无论如何,如果我不想使用异常,我会循环使用值。谢谢。。还有一件事我刚刚发现,我只需要在枚举中将字符串ss与h1、h2或h3进行比较。。我不需要检查枚举中的h4。。在您当前的示例中,知道如何使用Enum执行此操作吗?也许只需使用val.toString,而不是将字符串作为私有值添加。所以没有双重标准addeting@BennX这是一个选项,但我只是想展示如何避免使用序数。当然,我只是想提一下。我使用您的解决方案在枚举中保存不同的状态。但在这种情况下,双写是不必要的,但可能有用。@BennX是的,在这种情况下,它不是必需的,因为OP只是使用与常量名称相同的值。可能只使用val.toString,而不是将字符串作为私有值添加。所以没有双重标准addeting@BennX这是一个选项,但我只是想展示如何避免使用序数。当然,我只是想提一下。我使用您的解决方案在枚举中保存不同的状态。但在这种情况下,双写是不必要的,但我可能会有用。@BennX是的,在这种情况下,它不是必需的,因为OP只是使用与常量名称相同的值。