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只是使用与常量名称相同的值。