Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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_Arrays - Fatal编程技术网

java中如何将字符串数组转换为枚举数组

java中如何将字符串数组转换为枚举数组,java,enums,arrays,Java,Enums,Arrays,我有一个字符串数组,其中包含从用户获取的枚举值。现在如何将这个字符串数组转换为enum数组,以便元素可以迭代并在其他方法中进一步使用?这需要在Java中完成 基本上我想问的是,例如,如果我有这个数组 String [] names = {"Autumn", "Spring", "Autumn", "Autumn" }; 我有这个枚举 enum Season { Autumn, Spring; } 现在如何将上述字符串类型的数组转换为枚举季节类型的数组?如下所示: 如果需要查找,可以

我有一个字符串数组,其中包含从用户获取的枚举值。现在如何将这个字符串数组转换为enum数组,以便元素可以迭代并在其他方法中进一步使用?这需要在Java中完成

基本上我想问的是,例如,如果我有这个数组

String [] names = {"Autumn", "Spring", "Autumn", "Autumn" };
我有这个枚举

enum Season
{ 
    Autumn, Spring;
}
现在如何将上述字符串类型的数组转换为枚举季节类型的数组?

如下所示:

如果需要查找,可以执行以下操作:

Weekdays weekday = Weekdays.valueOf("Monday");
System.out.println(weekday);

但是要小心,因为如果提供的
字符串不存在,这将抛出
IllegalArgumentException

如果您使用的是Swing而不是命令提示符或web表单,那么实际上可以将枚举实例传递到JComboBox中。当用户做出选择时,您将直接获得枚举实例,而不必在字符串和枚举之间转换。这样做的好处是,您无需担心更改枚举名称或大小写错误

例如:

public class Enums 
{
    public enum Days{
        MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; 

        public String toString() {
            //return user-friendly name, or whatever else you want.
                    //for complex rendering, you need to use cell renderer for the combo box
            return name().substring(0,1) + name().toLowerCase().substring(1, name().length());
        };
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Enum test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JComboBox<Days> combo = new JComboBox<>(Days.values());
        combo.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if(e.getStateChange() == ItemEvent.SELECTED){
                    Days selected = combo.getItemAt(combo.getSelectedIndex());
                    System.out.println(selected);
                }
            }
        });
        frame.add(combo);

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
公共类枚举
{
公众普查日{
周一、周二、周三、周四、周五、周六、周日;
公共字符串toString(){
//返回用户友好的名称,或任何您想要的名称。
//对于复杂渲染,需要对组合框使用单元渲染器
返回name().substring(0,1)+name().toLowerCase().substring(1,name().length());
};
}
公共静态void main(字符串[]args){
JFrame=新JFrame(“枚举测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
最终JComboBox组合=新的JComboBox(Days.values());
addItemListener(新的ItemListener(){
@凌驾
公共无效itemStateChanged(ItemEvent e){
如果(如getStateChange()==ItemEvent.SELECTED){
所选天数=combo.getItemAt(combo.getSelectedIndex());
系统输出打印项次(选中);
}
}
});
frame.add(组合);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
}

没有类型转换,没有字符串匹配。超级安全。

这里有一个完整的代码示例:

    String s[]=new String[Numbers.values().length];
    int i =0;
    for (Numbers op : Numbers.values()) {
        s[i++] =op.toString();
        System.out.println(op.toString());
    }


   public enum Numbers {
    one,
    two,
    three
   }
private static List<Season> foo(List<String> slist) {
    List<Role> list = new ArrayList<>();
    for (String val : slist) {
        list.add(Season.valueOf(val));
    }
    return list;
}
私有静态列表foo(列表slist){
列表=新的ArrayList();
用于(字符串val:slist){
列表.添加(季节.价值(val));
}
退货清单;
}
现在,如果您想为任何枚举创建一个通用方法,那么它就有点麻烦了。您必须使用“通用方法”:

私有静态列表makeIt(类clazz,列表值){
列表=新的ArrayList();
for(字符串级别:值){
列表.添加(枚举值(类别,级别));
}
退货清单;
}
您必须将其称为以下内容:

List<Strings> slist = ....
List<Season> elist= makeIt(Season.class, slist);
List slist=。。。。
列表elist=makeIt(seasure.class,slist);

要回答实际问题:

public <T extends Enum<T>> T[] toEnums(String[] arr, Class<T> type)
{
    T[] result = (T[]) Array.newInstance(type, arr.length);
    for (int i = 0; i < arr.length; i++)
        result[i] = Enum.valueOf(type, arr[i]);
    return result;
}

Season[] seasons = toEnums(names, Season.class);
public T[]toEnums(字符串[]arr,类类型)
{
T[]结果=(T[])Array.newInstance(类型,arr.length);
对于(int i=0;i
从Java 8开始,您可以使用流在一行中实现这一点

String [] names = {"Autumn", "Spring", "Autumn", "Autumn" };
List<Season> seasons = Arrays.stream(names).map(Season::valueOf).collect(Collectors.toList());
String[]name={“秋”、“春”、“秋”、“秋”};
List seasures=Arrays.stream(names).map(seasure::valueOf.collect(Collectors.toList());

答案的参考资料。正在添加完整概述的链接。@jakub。。。是的,如果你能举个例子就好了
public <T extends Enum<T>> T[] toEnums(String[] arr, Class<T> type)
{
    T[] result = (T[]) Array.newInstance(type, arr.length);
    for (int i = 0; i < arr.length; i++)
        result[i] = Enum.valueOf(type, arr[i]);
    return result;
}

Season[] seasons = toEnums(names, Season.class);
String [] names = {"Autumn", "Spring", "Autumn", "Autumn" };
List<Season> seasons = Arrays.stream(names).map(Season::valueOf).collect(Collectors.toList());