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

家庭作业:Rock Paper Scissors游戏。

我创建了一个枚举:

enum Gesture{ROCK,PAPER,SCISSORS}; 

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

啊……废话……这将澄清: userPick是一个带有价值rockpaperscissorsString 。 我无法使用==来比较userPickcomputerPick ,正如你在下面看到的那样,它是从我的enumGesture类型。

  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教程中找到类似情况的例子,所以我不确定如何纠正这个问题……

任何提示?

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

 if (userPick.equalsIgnoreCase(computerPick.name())) . . . 

顺便说一句,如果您保证computer始终是值13 (并且没有别的),您可以将其转换为Gesture枚举:

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

你可以用更简单的方式完成,如下所示:

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

我的想法:

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

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

定义枚举:

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

静态导入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 } 

}

这似乎很干净。

 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 } 

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

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

}