Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
打开枚举值的Java开关_Java_Enums - Fatal编程技术网

打开枚举值的Java开关

打开枚举值的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("

我希望用户输入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("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天是星期四。