Java 什么';比较字符串和枚举值的正确方法是什么?

Java 什么';比较字符串和枚举值的正确方法是什么?,java,enums,Java,Enums,家庭作业:石头布剪刀游戏 我创建了一个枚举: enum Gesture{ROCK,PAPER,SCISSORS}; 我想通过比较这些值来决定谁赢——计算机还是人类。设置这些值效果很好,并且比较工作正常(纸盖住石头,石头压碎剪刀,剪刀剪纸)。然而,我无法拿到领带去上班。只要出现平局,用户就被宣布为赢家 啊哈…废话…这将澄清:userPick是一个字符串,其值为rock、paper或剪刀。我无法使用==将userPick与computerPick进行比较,正如您在下面看到的,这是从我的

家庭作业:石头布剪刀游戏

我创建了一个枚举:

      enum Gesture{ROCK,PAPER,SCISSORS};
我想通过比较这些值来决定谁赢——计算机还是人类。设置这些值效果很好,并且比较工作正常(纸盖住石头,石头压碎剪刀,剪刀剪纸)。然而,我无法拿到领带去上班。只要出现平局,用户就被宣布为赢家

啊哈…废话…这将澄清:
userPick
是一个
字符串
,其值为
rock
paper
剪刀
。我无法使用
==
userPick
computerPick
进行比较,正如您在下面看到的,这是从我的
enum
中转换为type
手势的

      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
,或者
字符串userPick
无法匹配
手势computerPick
,因为后者不是
字符串。然而,在我的教科书或Oracle的Java教程中,我找不到类似情况的例子,所以我不确定如何纠正这个问题


有什么提示吗?

我从您的问题中了解到,
userPick
是一个
String
值。你可以这样比较:

if (userPick.equalsIgnoreCase(computerPick.name())) . . .
另一方面,如果保证
计算机
始终是
1
2
3
(除此之外)中的一个值,则可以使用以下各项将其转换为
手势
枚举:

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

您应该在
enum
中声明
toString()
valueOf()
方法

 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;
    }
}
import java.io.Serializable;
公共枚举手势实现可序列化{
石头、布、剪刀;
公共字符串toString(){
开关(本){
凯斯洛克:
返回“岩石”;
案例文件:
返回“文件”;
案例剪刀:
返回“剪刀”;
}
返回null;
}
公共静态手势值(类枚举类型,字符串值){
if(value.equalsIgnoreCase(ROCK.toString()))
返回手势。摇滚;
else if(value.equalsIgnoreCase(PAPER.toString()))
还纸;
else if(value.equalsIgnoreCase(SCISSORS.toString()))
返回手势。剪刀;
其他的
返回null;
}
}

您可以用一种更简单的方法来完成,如下所示:

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

这看起来很干净

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
}

您可以将字符串与枚举项进行比较,如下所示:

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

    }
}
我的想法是:

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);
    }
}
如果你想检查你写的值:

SomeKindOfEnum.ENUM_NAME.equalValue("initialValue")

对我来说有点不错:)。也许有人会发现它很有用。

静态导入GestureTypes,然后使用valuesOf()方法可以让它看起来更干净:

enum GestureTypes{ROCK,PAPER,SCISSORS};

定义枚举:

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(gestureString);

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

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

        case SCISSORS:
            Log.i("TAG", "SCISSORS");
            break;
    }
}
您可以使用
equals()


enum.equals(String)

这是我在java 8中的解决方案:

 public static Boolean isValidCity(String cityCode) {
        return Arrays.stream(CITY_ENUM.values())
                .map(CITY_ENUM::getCityCode)
                .anyMatch(cityCode::equals);
 }

没错,不能将字符串“rock”与enum signature.rock进行比较。您需要某种字符串->手势映射函数,以便比较两个枚举。幸运的是,Java已经提供了一个。尝试
手势.valueOf([您的字符串])
。如果我没记错的话,这个函数区分大小写。但我可能错了,这个函数是区分大小写的。谢谢@泰德·霍普:很好,很好的回答。非常感谢。接下来的一个问题是:
计算机拾取
~do~末尾的
.name
是什么?我假设这是指向
computerPick
?我试图理解它与if(userPick.equalsIgnoreCase(computerPick())
的区别。谢谢@dwwilson66-如果
computerPick
是类型为
siture
的枚举值,则
computerPick().name()
返回一个
字符串,其中包含
computerPick
当前值的符号名。(也就是说,如果
computerPick==signature.ROCK
,那么
computerPick.name()
将是字符串“ROCK”。(每个
enum
类型都有编译器生成的实例方法
name()
ordinal()
。该类型还有静态方法
values()
valueOf(string)
自动生成。请参阅.Nice.谢谢。这很有意义。
name()
当然没有包含在我的教科书中,这似乎更多地牺牲了细节以提高可读性….:\我正在使用java 8,当我选择.name()时,我看到了这一点-返回此枚举常量的名称,与在其枚举声明中声明的名称完全相同。大多数程序员应该优先使用toString方法,因为toString方法可能会返回更友好的名称。此方法主要用于正确性取决于获取exac的特殊情况返回:此枚举常量的名称这是一个很好的示例,在Java 7中,valueOf方法已在enum中实现。但其工作原理与您的示例相同。根据,每个
enum
类型声明自动生成一个静态
valueOf(字符串)
的行为类似于您的方法(除了它抛出异常而不是返回
null
,并且区分大小写)。每个
enum
常量也继承自
enum
方法
name()
,该方法的行为类似于
toString()
(返回
enum
常量的确切名称).@Evan-
valueOf
自从Enum被引入Java以来一直是
Enum
类的一部分;它对Java 7来说并不新鲜。这对于Enum包含下划线并且您需要比较的情况非常有用……非常感谢您……尝试使用类似th的字符串
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");
        }


    }
}
 public static Boolean isValidCity(String cityCode) {
        return Arrays.stream(CITY_ENUM.values())
                .map(CITY_ENUM::getCityCode)
                .anyMatch(cityCode::equals);
 }