Java 根据用户输入分配枚举

Java 根据用户输入分配枚举,java,Java,我正在尝试构建一个简单的控制台Tictatcoe游戏。我正试图让用户选择圆圈或交叉来作为游戏。我有一个循环和交叉的枚举 每次运行程序时,我都会得到else输出,即使我输入“圆圈”或“十字” 不是寻找代码答案,只是想看看是否有人能为我指出错误的方向 import java.util.Scanner; public class Game { private Model model; private Model player; public Game() {

我正在尝试构建一个简单的控制台Tictatcoe游戏。我正试图让用户选择圆圈或交叉来作为游戏。我有一个循环和交叉的枚举

每次运行程序时,我都会得到else输出,即使我输入“圆圈”或“十字”

不是寻找代码答案,只是想看看是否有人能为我指出错误的方向

import java.util.Scanner;

public class Game {

    private Model model;
    private Model player;

    public Game() {

        Scanner input = new Scanner(System.in);
        System.out.println("Do you want to play as Cross or Circle");
        input.nextLine();

        if(input.equals(Model.valueOf("CROSS"))) {
            player = Model.CROSS;
        } else if(input.equals(Model.valueOf("CIRCLE"))) {
            player = Model.CIRCLE;
        } else {
            System.out.println("Invalid choice, please choose either Circle or Cross");
        }

    }
}

input
是一个
Scanner
,永远不会等于枚举实例。您需要存储
input.nextLine()
的结果并进行比较

String line = input.nextLine();
if (line.equals("CROSS")) {
  ...
} else if (line.equals("CIRCLE")) {
  ...
} else {
  ...
}

input
是一个
Scanner
,永远不会等于枚举实例。您需要存储
input.nextLine()
的结果并进行比较

String line = input.nextLine();
if (line.equals("CROSS")) {
  ...
} else if (line.equals("CIRCLE")) {
  ...
} else {
  ...
}

从JDK 11文档中,类Enum的方法
valueOf

返回具有指定名称的指定枚举类型的枚举常量。名称必须与用于在此类型中声明枚举常量的标识符完全匹配。(不允许使用无关的空白字符。) 请注意,对于特定的枚举类型T,可以使用该枚举上隐式声明的公共静态T valueOf(String)方法代替此方法,以从名称映射到相应的枚举常量。枚举类型的所有常量都可以通过调用该类型的隐式公共静态T[]values()方法获得

也许你想这样写你的if

   String line = input.nextLine();
   if(Model.CROSS == Model.valueOf(line.trim())) {
        player = Model.CROSS;
    } else if(Model.CIRCLE == Model.valueOf(line.trim())) {
        player = Model.CIRCLE;
    } else {
        System.out.println("Invalid choice, please choose either Circle or Cross");
    }

另一个优点是
stringline=input.nextLine()
如何在这里建议另一个答案

来自JDK 11 doc类Enum的方法
valueOf

返回具有指定名称的指定枚举类型的枚举常量。名称必须与用于在此类型中声明枚举常量的标识符完全匹配。(不允许使用无关的空白字符。) 请注意,对于特定的枚举类型T,可以使用该枚举上隐式声明的公共静态T valueOf(String)方法代替此方法,以从名称映射到相应的枚举常量。枚举类型的所有常量都可以通过调用该类型的隐式公共静态T[]values()方法获得

也许你想这样写你的if

   String line = input.nextLine();
   if(Model.CROSS == Model.valueOf(line.trim())) {
        player = Model.CROSS;
    } else if(Model.CIRCLE == Model.valueOf(line.trim())) {
        player = Model.CIRCLE;
    } else {
        System.out.println("Invalid choice, please choose either Circle or Cross");
    }

另一个优点是
stringline=input.nextLine()
如何建议此处的另一个答案

您试图检查scanner对象是否等于枚举的字符串值,而不是将nextLine()返回值保存到字符串变量,并检查变量是否相等,最好使用equalsIgnoreCase

public Game() {

    Scanner scanner = new Scanner(System.in);
    System.out.println("Do you want to play as Cross or Circle");
    String input =  scanner.nextLine();
    if(input.equalsIgnoreCase(Model.CIRCLE.name())) {
        player = Model.CROSS;
    } else if(input.equalsIgnoreCase(Model.CROSS.name())) {
        player = Model.CIRCLE;
    } else {
        System.out.println("Invalid choice, please choose either Circle or Cross");
    }

}

您试图检查scanner对象是否等于枚举的字符串值,而不是将nextLine()返回值保存到字符串变量,并检查变量是否相等,最好使用equalsIgnoreCase

public Game() {

    Scanner scanner = new Scanner(System.in);
    System.out.println("Do you want to play as Cross or Circle");
    String input =  scanner.nextLine();
    if(input.equalsIgnoreCase(Model.CIRCLE.name())) {
        player = Model.CROSS;
    } else if(input.equalsIgnoreCase(Model.CROSS.name())) {
        player = Model.CIRCLE;
    } else {
        System.out.println("Invalid choice, please choose either Circle or Cross");
    }

}

Ops,我发布了另一个解决方案,但我错过了它,请点击这里:-)但我也留下了我的,给一些API知识,在使用该方法之前,该人员需要阅读文档:-)Ops,我发布了另一个解决方案,但我错过了它,更新此:-)但我也留下了一些API知识,在使用该方法之前,该人员需要阅读文档:-)在控制台输入中处理选项时,另一种常用的方法是枚举ex(1)选项A,(2)选项B。。。等等。用户输入与选项关联的数字/字符,这通常会使处理此类情况变得更简单。在您的情况下,您可以使用
string
equalsIgnoreCase
方法在if语句中进行字符串比较,然后您将不需要使用
valueOf
您可以设置直接枚举到
player
。在控制台输入中处理选项时,另一种常用的方法是枚举ex(1)选项A,(2)选项B。。。等等。用户输入与选项关联的数字/字符,这通常会使处理此类情况变得更简单。在您的情况下,您可以使用
string
equalsIgnoreCase
方法在if语句中进行字符串比较,然后您将不需要使用
valueOf
您可以设置直接枚举到
播放器