Blog coding and discussion of coding about JavaScript, PHP, CGI, general web building etc.

Monday, April 4, 2016

What's the proper way to compare a String to an enum value?

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?

Thanks d

Answer by Ted Hopp for What's the proper way to compare a String to an enum value?


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];  

Answer by kandarp for What's the proper way to compare a String to an enum value?


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 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;      }  }  

Answer by oiyio for What's the proper way to compare a String to an enum value?


You can do it in a simpler way , like the below:

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

Answer by Rami Stefanidis for What's the proper way to compare a String to an enum value?


This seems to be clean.

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);  }  

And then in main code:

String airplane="BOEING_747";    if(Plane.BOEING_747.equalsIgnoreCase(airplane)){       //code  }  

Answer by mjaifar for What's the proper way to compare a String to an enum value?


You can compare a string to an enum item as follow,

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");      }    }  

}

Answer by Crushnik for What's the proper way to compare a String to an enum value?


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.

Answer by User2709 for What's the proper way to compare a String to an enum value?


Doing an static import of the GestureTypes and then using the valuesOf() method could make it look much cleaner-

enum GestureTypes{ROCK,PAPER,SCISSORS};  

and

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  }  

}


Fatal error: Call to a member function getElementsByTagName() on a non-object in D:\XAMPP INSTALLASTION\xampp\htdocs\endunpratama9i\www-stackoverflow-info-proses.php on line 72

0 comments:

Post a Comment

Popular Posts

Powered by Blogger.