将String与枚举值进行比较的正确方法是什么?

dww*_*n66 38 java enums

作业:Rock Paper Scissors游戏.

我创建了一个枚举:

      enum Gesture{ROCK,PAPER,SCISSORS};
Run Code Online (Sandbox Code Playgroud)

从中我想比较价值来决定谁赢 - 计算机或人.设置值很好,比较工作正常(纸张覆盖岩石,岩石压碎剪刀,剪刀剪纸).但是,我无法让我的领带发挥作用.只要有平局,用户就会被宣布为获胜者.

唉唉......废话......这将澄清:userPick是一个String具有价值rock,paperscissors.我无法用==比较userPickcomputerPick,正如你可以看到下面强制转换为类型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....
Run Code Online (Sandbox Code Playgroud)

我猜这是一个rock不等于ROCK或者String userPick无法匹配的问题,Gesture computerPick因为后者不是String.但是,我无法在我的教科书或Oracle的Java教程中找到类似情况的例子,所以我不确定如何纠正这个问题......

任何提示?

Ted*_*opp 46

我从你的问题是收集userPick是一个String值.你可以这样比较:

if (userPick.equalsIgnoreCase(computerPick.name())) . . .
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果你是保证computer始终是一个值1,23(和没有别的),你可以将其转换为Gesture与枚举:

Gesture computerPick = Gesture.values()[computer - 1];
Run Code Online (Sandbox Code Playgroud)


kan*_*arp 22

你应该声明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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 根据[Java语言规范§8.9.2](http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9.2),每个`enum` type声明自动生成一个静态`valueOf(String)`,其行为类似于您的方法(除了它抛出异常而不是返回`null`并且区分大小写).每个`enum`常量也继承自`Enum`方法`name()`,其行为类似于`toString()`(返回`enum`常量的确切名称).@Evan - "valueOf"已成为"Enum"类的一部分,因为枚举被引入Java; 它对Java 7来说并不陌生. (7认同)
  • 这是一个很好的例子,在 Java 7 中 valueOf 方法已经在 Enum 中实现。不过,它的工作原理与您的示例相同。 (2认同)

Cru*_*nik 6

我的想法:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你想检查价值你写:

SomeKindOfEnum.ENUM_NAME.equalValue("initialValue")
Run Code Online (Sandbox Code Playgroud)

有点看起来很好:).也许有人会发现它很有用.


小智 6

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


    }
}
Run Code Online (Sandbox Code Playgroud)


Aya*_*fov 5

定义枚举:

public enum Gesture
{
    ROCK, PAPER, SCISSORS;
}
Run Code Online (Sandbox Code Playgroud)

定义一个检查enum内容的方法:

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

    return false;
}
Run Code Online (Sandbox Code Playgroud)

并使用它:

String gestureString = "PAPER";

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

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

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

        case SCISSORS:
            Log.i("TAG", "SCISSORS");
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)