打开枚举值的Java开关
我希望用户输入1到7之间的数字。如果数字为1,则打印为星期一。如果数字为2,则打印为星期二,以此类推 下面的代码可以编译,但逻辑上不正确 如需帮助,请参见备注:打开枚举值的Java开关,java,enums,Java,Enums,我希望用户输入1到7之间的数字。如果数字为1,则打印为星期一。如果数字为2,则打印为星期二,以此类推 下面的代码可以编译,但逻辑上不正确 如需帮助,请参见备注: import java.util.Scanner; public class Test { private enum Week { MONDAY("1"), TUESDAY("2"), WEDNESDAY("3"), THURSDAY("4"), FRIDAY("5"), SATURDAY("
import java.util.Scanner;
public class Test {
private enum Week {
MONDAY("1"), TUESDAY("2"), WEDNESDAY("3"),
THURSDAY("4"), FRIDAY("5"), SATURDAY("6"), SUNDAY("7");
private String value;
private Week(String value) {
this.value = value;
}
}
public static void main(String[] args) {
// How to instantiate this correctly, so that it doesn't only point to one value
Week week = Week.MONDAY;
System.out.print("Enter a number: ");
Scanner input = new Scanner(System.in);
String userInput = input.next();
// The switch parameter is not correct. This is what needs to be fixed.
// I want to use this case layout.
//The enums each have a value. The user enters a value. I want to switch over userInput.
switch (week) {
case MONDAY: System.out.println("That's Monday"); break;
case TUESDAY: System.out.println("That's Tuesday"); break;
case WEDNESDAY: System.out.println("That's Wednesday"); break;
case THURSDAY: System.out.println("That's Thursday"); break;
case FRIDAY: System.out.println("That's Friday"); break;
case SATURDAY: System.out.println("That's Saturday"); break;
case SUNDAY: System.out.println("That's Sunday"); break;
default: break;
}
}
}
在周枚举内创建get方法,以便通过给定字符串获取周,例如:
public enum Week {
...
public Week getWeek(String key) {
... logic lookup
... obtain a Week(weekResult) with that key
return weekResult;
}
}
也可以尝试使用枚举方法valueOf(…)
我认为,有了这一点,你就有必要从正确的角度出发了。以下是一个版本:
import java.util.Arrays;
import java.util.Scanner;
public class Test {
private enum Week {
MONDAY(1, "That's Monday"), TUESDAY(2, "That's Tuesday"), WEDNESDAY(3, "That's Wednesday"), THURSDAY(4,
"That's Thursday"), FRIDAY(5,
"That's Friday"), SATURDAY(6, "That's Saturday"), SUNDAY(7, "That's Sunday");
private int value;
private String description;
private Week(int value, String description) {
this.value = value;
this.description = description;
}
public static Week getByValue(int value) {
return Arrays.stream(values()).findFirst().get();
}
public String getDescription() {
return description;
}
}
public static void main(String[] args) {
System.out.print("Enter a number: ");
Scanner input = new Scanner(System.in);
int userInput = input.nextInt();
Week week = Week.getByValue(userInput);
System.out.println(week.getDescription());
}
}
当输入的号码无效时,我将错误处理留给您
如您所见,我删除了
开关
块,并从enum description获取了消息。您需要引入一种方法,根据传入的值获取enum常量:
public static Week fetchValue(String constant) {
for (Week week : Week.values()) {
if (week.value.equals(constant)) {
return week;
}
}
return null;
}
现在像这样使用它:
Week weekday = Week.fetchValue(userInput);
if (weekday != null) {
switch (week ) {
// rest of the code
}
} else {
System.out.println("Incorrect input");
}
您需要创建一个
Week
变量,该变量对应于用户输入的数字首先解析字符串输入以获取整数,然后使用枚举类型的
values()
集合获取枚举值:
public static void main(String[] args) {
System.out.print("Enter a number: ");
Scanner input = new Scanner(System.in);
String userInput = input.nextLine();
int userNumber= Integer.parseInt(userInput) % Week.values().length;
Week userWeek = Week.values()[userNumber - 1];
switch (userWeek) {
case MONDAY: System.out.println("That's Monday"); break;
case TUESDAY: System.out.println("That's Tuesday"); break;
case WEDNESDAY: System.out.println("That's Wednesday"); break;
case THURSDAY: System.out.println("That's Thursday"); break;
case FRIDAY: System.out.println("That's Friday"); break;
case SATURDAY: System.out.println("That's Saturday"); break;
case SUNDAY: System.out.println("That's Sunday"); break;
default: break;
}
}
Enum
s已经有了它们的整数值,但它是从0
开始计数的,因此如果您可以进行小的重新排列,则不需要单独的值
字段
import java.util.Scanner;
public class Main {
private enum Week {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY;
static Week get(Integer i) {
return values()[i % 7];
}
}
public static void main(String[] args) {
System.out.print("Enter a number: ");
Scanner input = new Scanner(System.in);
int userInput = input.nextInt();
Week week = Week.get(userInput);
switch (week) {
case MONDAY:
System.out.println("That's Monday");
break;
case TUESDAY:
System.out.println("That's Tuesday");
break;
case WEDNESDAY:
System.out.println("That's Wednesday");
break;
case THURSDAY:
System.out.println("That's Thursday");
break;
case FRIDAY:
System.out.println("That's Friday");
break;
case SATURDAY:
System.out.println("That's Saturday");
break;
case SUNDAY:
System.out.println("That's Sunday");
break;
default:
break;
}
}
}
以下是一个例子:
enum Week{
MONDAY("1");
private String value;
Week(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public static Week getInstance(String value) {
return Week.valueOf(value);
}
}
public static void main(String[] args) {
String a = "1";
Week w = Week.getInstance(a);
switch (w) {
case MONDAY:
System.out.println("It is monday");
break;
default:
break;
}
}
简单地使用这个:
public class Test {
private enum Week {
MONDAY("1"),
TUESDAY("2"),
WEDNESDAY("3"),
THURSDAY("4"),
FRIDAY("5"),
SATURDAY("6"),
SUNDAY("7");
private String value;
private Week(String value) {
this.value = value;
}
}
public static void main(String[] args) {
// How to instantiate this correctly, so that it doesn't only point to one value
int dayOfWeek ;
System.out.print("Enter a number: ");
Scanner input = new Scanner(System.in);
dayOfWeek = Integer.valueOf(input.next()) -1;
if (dayOfWeek < 0 || dayOfWeek > 6) {
System.out.println("Out of range day of week");
System.exit(1);
}
// The switch parameter is not correct. This is what needs to be fixed.
// I want to use this case layout.
//The enums each have a value. The user enters a value. I want to switch over userInput.
switch (Arrays.asList(Week.values()).get(dayOfWeek)) {
case MONDAY: System.out.println("That's Monday"); break;
case TUESDAY: System.out.println("That's Tuesday"); break;
case WEDNESDAY: System.out.println("That's Wednesday"); break;
case THURSDAY: System.out.println("That's Thursday"); break;
case FRIDAY: System.out.println("That's Friday"); break;
case SATURDAY: System.out.println("That's Saturday"); break;
case SUNDAY: System.out.println("That's Sunday"); break;
default: break;
}
}
}
公共类测试{
私人枚举周{
星期一(“1”),
星期二(“2”),
星期三(“3”),
星期四(“4”),
星期五(“5”),
星期六(“6”),
星期日(“7”);
私有字符串值;
私人周(字符串值){
这个值=值;
}
}
公共静态void main(字符串[]args){
//如何正确地实例化它,这样它就不会只指向一个值
int dayOfWeek;
System.out.print(“输入一个数字:”);
扫描仪输入=新扫描仪(System.in);
dayOfWeek=Integer.valueOf(input.next())-1;
如果(星期日<0 | |星期日>6){
System.out.println(“超出范围的工作日”);
系统出口(1);
}
//开关参数不正确。这是需要修复的。
//我想使用这个案例布局。
//每个枚举都有一个值。用户输入一个值。我想切换到userInput。
开关(Arrays.asList(Week.values()).get(dayOfWeek)){
案例星期一:System.out.println(“那是星期一”);休息;
案例星期二:System.out.println(“那是星期二”);休息;
案例星期三:System.out.println(“那是星期三”);休息;
案例星期四:System.out.println(“那是星期四”);休息;
案例星期五:System.out.println(“那是星期五”);休息;
案例周六:System.out.println(“那是周六”);休息;
case SUNDAY:System.out.println(“那是星期天”);break;
默认:中断;
}
}
}
顺便说一句,这里是如何不用开关编写的
import java.util.Map;
import java.util.Scanner;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Test {
public static void main(String[] args) {
System.out.print("Enter a number: ");
Scanner input = new Scanner(System.in);
int userInput = input.nextInt();
WeekDay wd = WeekDay.dayByValueMap.get(userInput);
if (wd == null)
System.out.println("Unknown code " + userInput);
else
System.out.println("That's " + wd.titleCase());
}
}
enum WeekDay {
MONDAY(1), TUESDAY(2), WEDNESDAY(3),
THURSDAY(4), FRIDAY(5), SATURDAY(6), SUNDAY(7);
private int value;
private WeekDay(int value) {
this.value = value;
}
final static Map<Integer, WeekDay> dayByValueMap = Stream.of(values())
.collect(Collectors.toMap(w -> w.value, w -> w));
String titleCase() {
return Character.toTitleCase(name().charAt(0)) + name().substring(1).toLowerCase();
}
}
import java.util.Map;
导入java.util.Scanner;
导入java.util.stream.collector;
导入java.util.stream.stream;
公开课考试{
公共静态void main(字符串[]args){
System.out.print(“输入一个数字:”);
扫描仪输入=新扫描仪(System.in);
int userInput=input.nextInt();
WeekDay wd=WeekDay.dayByValueMap.get(用户输入);
如果(wd==null)
System.out.println(“未知代码”+用户输入);
其他的
System.out.println(“这是”+wd.titleCase());
}
}
枚举工作日{
星期一(1)、星期二(2)、星期三(3),
星期四(4)、星期五(5)、星期六(6)、星期日(7);
私有int值;
私人工作日(int值){
这个值=值;
}
最终静态映射dayByValueMap=Stream.of(values())
.collect(Collectors.toMap(w->w.value,w->w));
字符串滴定酶(){
返回Character.toTitleCase(name().charAt(0))+name().substring(1.toLowerCase();
}
}
你的枚举应该被称为工作日
或类似的名称。如果周
是枚举
你不应该尝试“创建周实例”,你是想使用周值()
很抱歉没有得到它吗?对于(周:EnumSet.allOf(Week.class))
是一种复杂的方法(Week-Week:Week.values())啊,我明白了。谢谢。当用户输入33(例如)输入一个数字时,这会给出输出那是星期四。因为%Week.values().length
。输入数字的模7。为什么?333天是星期四。