【问题标题】:How to convert string array to enum array in java如何在java中将字符串数组转换为枚举数组
【发布时间】:2012-11-05 23:14:05
【问题描述】:

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

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

String [] names = {"Autumn", "Spring", "Autumn", "Autumn" };

我有这个枚举

enum Season
{ 
    Autumn, Spring;
}

我现在如何将上面的 String 类型的数组转换为 enum Season 类型的数组?

【问题讨论】:

    标签: java enums arrays


    【解决方案1】:

    这是一个完整的代码示例:

    private static List<Season> foo(List<String> slist) {
        List<Role> list = new ArrayList<>();
        for (String val : slist) {
            list.add(Season.valueOf(val));
        }
        return list;
    }
    

    现在,如果您想为任何 Enum 创建一个通用方法,它会变得有点棘手。您必须使用“通用方法”:

    private static <T extends Enum<T>> List<T> makeIt(Class<T> clazz, List<String> values) {
        List<T> list = new ArrayList<>();
        for (String level : values) {
            list.add(Enum.valueOf(clazz, level));
        }
        return list;
    }
    

    你必须这样称呼它:

    List<Strings> slist = ....
    List<Season> elist= makeIt(Season.class, slist);
    

    【讨论】:

      【解决方案2】:

      像这样:code from here

      public enum Weekdays {
          Monday,
          Tuesday,
          Wednesday,
          Thursday,
          Friday,
          Saturday,
          Sunday
      }
      

      如果您需要进行查找,您可以这样做:

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

      但要小心,因为如果提供的String 不存在,这将抛出一个IllegalArgumentException

      【讨论】:

      • 答案参考website。添加完整概述的链接。
      【解决方案3】:

      回答实际问题:

      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);
      

      【讨论】:

        【解决方案4】:

        从 Java 8 开始,您可以在一行中使用流来实现这一点

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

        【讨论】:

          【解决方案5】:
              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
             }
          

          【讨论】:

            【解决方案6】:

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

            例子:

            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);
                }
            }
            

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

            【讨论】:

            • @jakub...是的,如果你能发布一个例子就足够了
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-09-27
            • 2018-07-07
            • 2012-11-30
            • 1970-01-01
            • 2021-04-11
            • 2020-02-13
            • 1970-01-01
            相关资源
            最近更新 更多