2015-11-16 4 views
2

Я пытаюсь получить подтверждение ввода, сравнивая результат строки (от сканера) до Enum потенциальных значений.Java, сравнивающий вход сканера с ENUM

Enum содержит название всех стран мира, пользователю предлагается ввести название страны - вход должен быть разрешен только в том случае, если входное значение присутствует в Enum - есть ли способ сделать это?

Спасибо!

ответ

2

Наиболее эффективный способ, чтобы попытаться получить Enum по имени и поймать исключение, используя Enum.valueOf(String) метод:

try { 
    CountryEnum country = CountryEnum.valueOf("user-input"); 
} catch (IllegalArgumentException e) { 
    System.err.println("No such country"); 
} 

Другим способом без перехвата исключений является сравнение пользовательского ввода каждого из значений перечислений :

String userInput = ...; 
boolean countryExists = false; 
for(CountryEnum country : CountryEnum.values()) { 
    if(userInput.equalsIgnoreCase(country.name())) { 
     countryExists = true; 
     break; 
    } 
} 
if(!countryExists) { 
    System.err.println("No such country"); 
    // exit program here or throw some exception 
} 
1

Используйте Enum.valueOf("string") != null если строковое значение существует как тип перечисления

Найти больше Ссылка здесь - http://www.tutorialspoint.com/java/lang/enum_valueof.htm

+1

Вы протестировали это? – RealSkeptic

+1

valueOf выбрасывает исключение. Он не возвращает значение null. – JustinKSU

0

должно работать

public class EnumTest { 
    enum Country{IND, AUS, USA; 
     static boolean exists(String key) { 
      Country[] countryArr = values(); 

      boolean found = false; 
      for(Country country : countryArr) { 
       if(country.toString().equals(key)) { 
        found = true; 
        break; 
       } 
      } 

      return found; 
     } 
    }; 

    public static void main(String[] args) { 
     System.out.println("Started"); 
     Scanner scan = new Scanner(System.in); 
     System.out.println(Country.exists(scan.nextLine())); 
     scan.close(); 
    } 
} 

Конечно, вы можете реализовать более эффективный поиск с помощью a Установите для сохранения значений. Enum.valueOf не может использоваться, поскольку он генерирует следующее исключение, если переданное значение не соответствует какой-либо константе перечисления.

java.lang.IllegalArgumentException: No enum constant 
+0

Если я использую Enum.valueOf с корпусом коммутатора, обрабатывал бы это исключение? Переключатель (enumVariable) case IND: код по умолчанию: «Это не действительная запись, пожалуйста, повторно введите»; – user5568948

+0

Исключения могут обрабатываться только приложением try/catch или throws в Java, коммутатор ничего не сделает для предотвращения исключения. **** Редактировать *** перед передачей аргумента для переключения с использованием аргумента аргумента аргумента Enum необходимо преобразовать в константу Enum, после чего вам придется обрабатывать исключение. – 11thdimension

0

Вы можете оборудовать Enum с помощью метода, который возвращает getByName(String name)null если Enum не держит соответствующее значение для данного имени :

public enum Country { 

    AFGHANISTAN, 
    ALBANIA, 
    ALGERIA, 
    ... 

    public static Country getByName(String name) { 

     try { 
      return valueOf(name.toUpperCase()); 
     } catch (IllegalArgumentException e) { 
      return null; 
     } 
    } 
} 

Теперь, когда пользователь входит в 'Neverland', очевидно getByName('Neverland') возвращает null, которые вы можете проверить. Вместо null вы также можете включить в свой список значение catch-all и вернуть его, например. TERRAINCOGNITA.

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