2014-02-20 3 views
1

у меня ниже перечисление -Как сравнить входную строку с перечислением?

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 в моем перечислении или нет? Как мне сделать это с помощью перечисления?

ответ

2

Самый простой подход:

try { 
    TestEnum.valueOf(ss); 
    System.out.println("valid"); 
} catch (IllegalArgumentException e) { 
    System.out.println("invalid"); 
} 
+0

Есть ли способ, который я могу использовать, если вместо этого проверяется инструкция? –

+0

Не ... на самом деле, не без смещения работы в другом месте. Вы можете создать статическую окончательную карту имен перечислений или цикл непосредственно над значениями перечисления. –

+0

@SSH 'values' и' valueOf' определяются [JLS] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9) и они не определили версию 'boolean', которая проверяет. Думаю, это была бы полезная функция. (Я еще не знаю Java 8 - они не добавили этого, не так ли?) В любом случае, если бы я не хотел использовать исключения, я бы перебирал «значения». – ajb

2

Вы должны избегать использования ordinals для enum. Скорее дайте значение каждой константе перечисления и введите поле.

Итак, ваш enum должен выглядеть следующим образом:

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"); 
} 
+0

Возможно, просто используйте 'val.toString()' вместо добавления String как private Value. Таким образом, нет двойного добавления – BennX

+0

@BennX Это вариант, но я просто хотел показать, как избежать использования ординалов. –

+1

уверен, что просто хотел упомянуть. Я использую ваше решение для сохранения разных состояний в перечислении. Но в этом случае двойное письмо не обязательно, но полезно. – BennX

1

Установка значения для каждого перечисления казалось мне ненужным. Вот решение, которое использует toString() вместо .value, которое я чувствую немного проще:

Смежные вопросы