What's the proper way to compare a String to an enum value?
Homework: Rock Paper Scissors game.
I've created an enumeration:
enum Gesture{ROCK,PAPER,SCISSORS};
from which I want to compare values to decide who wins--computer or human. Setting the values works just fine, and the comparisons work properly (paper covers rock, rock crushes scissors, scissors cuts paper). However, I cannot get my tie to work. The user is declared as the winner any time there's a tie.
Ahhh...crap...this will clarify: userPick
is a String
with values rock
, paper
, or scissors
. I'm unable to use ==
to compare userPick
to computerPick
, which, as you can see below, is cast as type Gesture
from my 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....
I am guessing that there's an issue with rock
not being equal to ROCK
, or the String userPick
not being able to match Gesture computerPick
because the latter isn't a String
. However, I'm not able to find an example of a similar circumstance in my textbook or Oracle's Java Tutorials, so I'm not sure how to correct the problem...
Any hints?
Solution 1:
I'm gathering from your question that userPick
is a String
value. You can compare it like this:
if (userPick.equalsIgnoreCase(computerPick.name())) . . .
As an aside, if you are guaranteed that computer
is always one of the values 1
, 2
, or 3
(and nothing else), you can convert it to a Gesture
enum with:
Gesture computerPick = Gesture.values()[computer - 1];
Solution 2:
You should declare toString()
and valueOf()
method in 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;
}
}
Solution 3:
My idea:
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);
}
}
And if u want to check Value u write:
SomeKindOfEnum.ENUM_NAME.equalValue("initialValue")
Kinda looks nice for me :). Maybe somebody will find it useful.
Solution 4:
public class Main {
enum Vehical{
Car,
Bus,
Van
}
public static void main(String[] args){
String vehicalType = "CAR";
if(vehicalType.equals(Vehical.Car.name())){
System.out.println("The provider is Car");
}
String vehical_Type = "BUS";
if(vehical_Type.equals(Vehical.Bus.toString())){
System.out.println("The provider is Bus");
}
}
}