我正在为课程作业编写一个多项式计算器,我想在切换案例中使用枚举。
这是我写的enum方法:
choice = mysc.nextInt();
Options o = Options.convert(choice);
switch(o)
{
case ADDITION: Add(isRational);break;
case MULTIPLICATION: Mul(isRational);break;
case EVALUATION: Evaluate(isRational);break;
case DERIVIATE: Derivative(isRational);break;
case EXIT: break;
}
程序中的这个开关案例:
{{1}}
我想在switch case中使用enum,但我希望用户的输入是一个int,因为它是赋值的必要条件。
我想将我从用户获得的int转换为相应的枚举,并在切换案例中使用它。
有没有办法将它转换为正确的枚举而不使用枚举中的convert方法?
答案 0 :(得分:1)
将您的枚举更改为从基于0的索引开始并使用Enum.values()[index]
。这是一个简单的代码示例,您可能希望为无效的枚举值引入某种验证:
import java.io.BufferedInputStream;
import java.util.Scanner;
class Scratch {
public static void main(String[] args) {
Scanner input = new Scanner(new BufferedInputStream(System.in));
System.out.println("Enter Value");
int choice = Integer.parseInt(input.nextLine());
System.out.println(choice);
Options enumValue = Options.values()[choice];
System.out.println(enumValue);
}
}
enum Options{
ADDITION(0),
MULTIPLICATION(1),
EVALUATION(2),
DERIVIATE(3),
EXIT(4);
public final int value;
Options(int value){
this.value = value;
}
public int getValue() {
return value;
}
}
<强>输出强>
另外,仅供参考,Enum.values()[index]
可能有点贵,所以如果性能问题请记住。由于这是一项任务,我怀疑这是一个值得关注的事情,但要记住你自己的理解。
答案 1 :(得分:1)
整数和枚举值之间的映射实际上并不是使用枚举值的API的一部分。现在,你要求用户输入一个整数。但是,如果您稍后编写GUI并在下拉列表中显示枚举值的名称,该怎么办?或者编写一个解析器来解析算术表达式?那些整数将不再相关。它们存在于菜单中,因此它们属于显示菜单的程序部分。
您可以引入一个Map<Integer,Options>
来将用户输入映射到枚举值。但是,如果您为枚举添加了新值,则必须记住将其添加到Map
。
我将使用Options.values()
返回的数组。迭代它以显示您的菜单,并使用它来按索引查找值。这种方法也有一些警告。如果重新排列代码中的值,它们的顺序也会在数组中发生变化。菜单选项的顺序会发生变化,可能会使用户感到困惑。但你的程序仍然会运行。使用枚举序数值的真正问题在于序列化它们(将它们写入持久存储,如文件),然后在更改顺序后尝试读取它们。只要你没有序列化你的枚举常量,就可以使用它们的序数值。