Каков правильный способ сравнить 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, поэтому я не уверен, как исправить проблему...
Любые подсказки?
Ответы
Ответ 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");
}
}
}