2013-11-07 2 views
8

Я делаю рулетку (свою собственную версию) с Java, и один из типов ставок, которые может сделать игрок, - это выбрать цвет, который будет свернут. (Даже черный, нечетный красный). Есть ли способ, которым я могу использовать оператор switch для сравнения строки с перечислением?Использовать оператор switch для сравнения строки с перечислением

private enum colors{red, black}; 
private String colorGuess; 
private boolean colorVerify = false; 
public void getColorGuess(){ 
do{ 
Scanner in = new Scanner(System.in); 
colorGuess = in.nextLine(); 
switch(colors){ 
case red: 
    colorVerify = true; 
    break; 
case black: 
    colorVerify = true; 
    break; 
default: 
    System.out.println("Invalid color selection!"); 
    break; 
}while(colorVerify = false); 

Это то, что я пытаюсь получить, но это не позволить мне использовать перечисления «цвет» в распределительном заявлении.

+1

false false false: 'while (colorVerify = false)' !!! – Tyco

+0

Я думаю, он пытается сказать, что в последней строке должен быть символ ==, а он правильный – LionC

+0

Или, еще лучше, 'while (! ColorVerify)' – dimo414

ответ

12

У вас должен быть экземпляр типа перечисления (его участник), на котором вы переключаетесь. Вы пытаетесь включить сам класс Enum, который является бессмысленной конструкцией. Таким образом, вы, вероятно, нужно

colors col = colors.valueOf(colorGuess); 
switch (col) ... 

BTW имя должно быть Colors, не colors уважать именование очень важный и не опциональный Java.

+1

, а в случаях должно быть указано имя класса перечислимого класса – Bohemian

+0

Нет, подразумевается имя класса перечисления. –

+0

@Bohemian: это на самом деле неверно; просто красный и черный будут делать в этом случае. – ljgw

3

Вы можете получить перечисление из строки с Enum.valueOf(). Позаботьтесь о том, чтобы в других ответах не упоминалось, что Enum.valueOf() будет вызывать IllegalArgumentException, если передана строка, которая не является действительным членом перечисления.

Обязательно правильно форматировать и отступа кода, это помогает нам читать и понимать, что происходит (и вы!):

// note the capitalization, and the singular 'Color' 
private enum Color {RED, BLACK}; 

// At least with the code provided, you don't need colorGuess or colorVerify to be 
// instance variables, they can be local to the method. Limiting the amount of 
// time a variable lives for (its scope) is critical for quality, maintainable code 

public Color getColorGuess() { 
    Scanner in = new Scanner(System.in); // this should be outside the while loop 
    while(in.hasNextLine()) { 
    // .toUpperCase() lets you type "red" or "RED" and still match 
    String line = in.nextLine().toUpperCase(); 
    try { 
     // Enum.valueOf() throws an exception if the input is not valid 
     Color guess = Color.valueOf(line); 

     switch(guess) { 
     case RED: 
      return guess; // return, rather than break, to exit the method 
     case BLACK: 
      return guess; 
     // As long as your switch statement covers all cases in your enum, you 
     // don't need a default: case, you'll never reach it 
     } 
    } catch (IllegalArgumentException e) { 
     System.out.println("Invalid color selection!"); 
    } 
    } 
} 

Обратите внимание, что мы теперь вернуться guess в обоих случаях, что несколько излишний. По крайней мере, с приведенным вами примером кода вам вообще не нужно отслеживать colorVerify, потому что метод будет продолжать цикл навсегда до ввода правильного цвета. Вы можете заменить весь оператор switch в моем методе простым return guess;, поскольку вы знаете, что это допустимое предположение, как только Color.valueOf() возвращает значение.

Другими словами, вы можете очистить свой код до:

public static Color getColorGuess() { 
    try (Scanner in = new Scanner(System.in)) { 
    while(in.hasNextLine()) { 
     try { 
     return Color.valueOf(in.nextLine().toUpperCase()); 
     } catch (IllegalArgumentException e) { 
     System.out.println("Invalid color selection!"); 
     } 
    } 
    } 
} 

Обратите внимание, что метод static теперь, и использует try-with-resources блок, чтобы закрыть Scanner, как только вы сделали с ним.

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