Подтвердить что ты не робот

Каков правильный способ сравнить String со значением enum?

Домашнее задание: игра "Бумажные ножницы".

Я создал перечисление:

      enum Gesture{ROCK,PAPER,SCISSORS};

из которого я хочу сравнить значения, чтобы решить, кто победит - компьютер или человек. Настройка значений работает очень хорошо, и сравнения работают правильно (бумажные обложки скалы, скальные породы, ножницы, ножницы разрезают бумагу). Однако я не могу заставить свою галстук работать. Пользователь объявляется победителем в любое время, когда есть связь.

Ahhh... crap... это прояснит: userPick - это String со значениями rock, paper или scissors. Я не могу использовать == для сравнения userPick с computerPick, который, как вы можете видеть ниже, приводится как тип Gesture из моего enum.

      if(computer == 1)
         computerPick = Gesture.ROCK;
      else
         if(computer == 2)
           computerPick = Gesture.PAPER;
         else
           computerPick = Gesture.SCISSORS;
      if(userPick.equals(computerPick))
       {
          msg = "tie";
          ++tieGames;
       }
           etc....

Я предполагаю, что проблема с rock не равна rock, или String userPick не может соответствовать Gesture computerPick, потому что последняя не является String. Тем не менее, я не могу найти пример аналогичного обстоятельства в учебнике или Oracle Java Tutorials, поэтому я не уверен, как исправить проблему...

Любые подсказки?

4b9b3361

Ответ 1

Я собираюсь из вашего вопроса, что userPick является значением String. Вы можете сравнить его следующим образом:

if (userPick.equalsIgnoreCase(computerPick.name())) . . .

В стороне, если вам гарантировано, что computer всегда является одним из значений 1, 2 или 3 (и ничего больше), вы можете преобразовать его в перечисление Gesture с

Gesture computerPick = Gesture.values()[computer - 1];

Ответ 2

Вы должны объявить метод toString() и valueOf() в enum.

 import java.io.Serializable;

public enum Gesture implements Serializable {
    ROCK,PAPER,SCISSORS;

    public String toString(){
        switch(this){
        case ROCK :
            return "Rock";
        case PAPER :
            return "Paper";
        case SCISSORS :
            return "Scissors";
        }
        return null;
    }

    public static Gesture valueOf(Class<Gesture> enumType, String value){
        if(value.equalsIgnoreCase(ROCK.toString()))
            return Gesture.ROCK;
        else if(value.equalsIgnoreCase(PAPER.toString()))
            return Gesture.PAPER;
        else if(value.equalsIgnoreCase(SCISSORS.toString()))
            return Gesture.SCISSORS;
        else
            return null;
    }
}

Ответ 3

Вы можете сделать это проще, как показано ниже:

boolean IsEqualStringandEnum (String str,Enum enum)
{
  if (str.equals(enum.toString()))
     return true;
  else
     return false;
}

Ответ 4

Моя идея:

public enum SomeKindOfEnum{
    ENUM_NAME("initialValue");

    private String value;

    SomeKindOfEnum(String value){
        this.value = value;
    }

    public boolean equalValue(String passedValue){
        return this.value.equals(passedValue);
    }
}

И если вы хотите проверить значение u, напишите:

SomeKindOfEnum.ENUM_NAME.equalValue("initialValue")

Kinda выглядит хорошо для меня:). Может быть, кто-то найдет это полезным.

Ответ 5

Выполнение статического импорта GestureTypes, а затем использование метода valuesOf() может заставить его выглядеть намного чище -

enum GestureTypes{ROCK,PAPER,SCISSORS};

и

import static com.example.GestureTypes.*;
public class GestureFactory {

public static Gesture getInstance(final String gesture) {
    if (ROCK == valueOf(gesture))
        //do somthing
    if (PAPER == valueOf(gesture))
        //do somthing
}

}

Ответ 6

Определить перечисление:

public enum Gesture
{
    ROCK, PAPER, SCISSORS;
}

Определите метод проверки содержимого enum:

private boolean enumContainsValue(String value)
{
    for (Gesture gesture : Gesture.values())
    {
        if (gesture.name().equals(value))
        {
            return true;
        }
    }

    return false;
}

И используйте его:

String gestureString = "PAPER";

if (enumContainsValue(gestureString))
{
    Gesture gestureId = Gesture.valueOf("PAPER");

    switch (gestureId)
    {
        case ROCK:
            Log.i("TAG", "ROCK");
            break;

        case PAPER:
            Log.i("TAG", "PAPER");
            break;

        case SCISSORS:
            Log.i("TAG", "SCISSORS");
            break;
    }
}

Ответ 7

Это кажется чистым.

public enum Plane{

/**
 * BOEING_747 plane.
 */
BOEING_747("BOEING_747"),

/**
 * AIRBUS_A380 Plane.
 */
AIRBUS_A380("AIRBUS_A380"),

;

private final String plane;       

private Plane(final String plane) {
    this.plane= plane;
}

Plane(){ 
    plane=null; 
}


/**
 * toString method.
 * 
 * @return Value of this Enum as String.
 */
@Override
public String toString(){
   return plane;
}

/**
 * This method add support to compare Strings with the equalsIgnoreCase String method.
 * 
 * Replicated functionality of the equalsIgnorecase of the java.lang.String.class
 * 
 * @param value String to test.
 * @return True if equal otherwise false.
 */
public boolean equalsIgnoreCase(final String value){
    return plane.equalsIgnoreCase(value);
}

И затем в главном коде:

String airplane="BOEING_747";

if(Plane.BOEING_747.equalsIgnoreCase(airplane)){
     //code
}

Ответ 8

Вы можете сравнить строку с элементом перечисления, как показано ниже,

public class Main {

enum IaaSProvider{
    aws,
    microsoft,
    google
}

public static void main(String[] args){

    IaaSProvider iaaSProvider = IaaSProvider.google;

    if("google".equals(iaaSProvider.toString())){
        System.out.println("The provider is google");
    }

}

}