9

ユーザーから取得した列挙値を含む文字列配列があります。この文字列配列を列挙型配列に変換して、要素を反復して他のメソッドでさらに使用できるようにするにはどうすればよいですか? これは Java で行う必要があります。

基本的に私が求めているのは、たとえば、この配列があるかどうかです

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

そして私はこの列挙型を持っています

enum Season
{ 
    Autumn, Spring;
}

上記の String 型の配列を enum Season 型の配列に変換するにはどうすればよいですか?

4

6 に答える 6

8

完全なコード例を次に示します。

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);
于 2014-01-28T21:02:56.800 に答える
7

このように:ここからのコード

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

ルックアップを行う必要がある場合は、次のことができます。

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

IllegalArgumentExceptionただし、提供されたStringが存在しない場合はスローされるので注意してください。

于 2012-11-17T11:14:22.517 に答える
5

実際の質問に答えるには:

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);
于 2014-09-23T03:16:59.180 に答える
0
    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
   }
于 2012-11-17T11:36:23.603 に答える
0

Swing を使用していて、コマンド プロンプトや Web フォームを使用していない場合は、enum インスタンスを JComboBox に実際に渡すことができます。ユーザーが選択すると、文字列と列挙型の間で変換する必要なく、列挙型インスタンスを直接取得できます。これには、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);
    }
}

型キャストなし、文字列マッチングなし。超安全。

于 2012-11-17T11:30:07.900 に答える