114

String列挙型要素の名前をs の配列として取得する最も簡単かつ/または最短の方法は何ですか?

これが意味することは、たとえば、次の列挙型がある場合です。

public enum State {
    NEW,
    RUNNABLE,
    BLOCKED,
    WAITING,
    TIMED_WAITING,
    TERMINATED;

    public static String[] names() {
        // ...
    }
}

メソッドはnames()配列を返し{ "NEW", "RUNNABLE", "BLOCKED", "WAITING", "TIMED_WAITING", "TERMINATED" }ます。

4

26 に答える 26

115

enumこれは、任意のクラスのワンライナーです。

public static String[] getNames(Class<? extends Enum<?>> e) {
    return Arrays.stream(e.getEnumConstants()).map(Enum::name).toArray(String[]::new);
}

Java 8 より前のバージョンは、エレガントではありませんが、まだワンライナーです。

public static String[] getNames(Class<? extends Enum<?>> e) {
    return Arrays.toString(e.getEnumConstants()).replaceAll("^.|.$", "").split(", ");
}

次のように呼び出します。

String[] names = getNames(State.class); // any other enum class will work

ハードコードされた列挙型クラスに単純なものが必要な場合:

public static String[] names() {
    return Arrays.toString(State.values()).replaceAll("^.|.$", "").split(", ");
}
于 2012-12-09T01:18:46.163 に答える
64

名前の配列を作成し、すべての列挙値を返すString[]静的values()メソッドを呼び出してから、値を反復処理して名前配列に入力します。

public static String[] names() {
    State[] states = values();
    String[] names = new String[states.length];

    for (int i = 0; i < states.length; i++) {
        names[i] = states[i].name();
    }

    return names;
}
于 2012-12-09T00:09:23.300 に答える
18

Apache Commons Lang 3を使用したエレガントなソリューションを次に示します。

EnumUtils.getEnumList(State.class)

リストを返しますが、リストを簡単に変換できますlist.toArray()

于 2016-03-01T08:50:37.707 に答える
16

Java 8を使用できる場合、これはうまく機能します(Yuraの提案の代わりに、より効率的です):

public static String[] names() {
    return Stream.of(State.values()).map(State::name).toArray(String[]::new);
}
于 2015-06-02T05:16:45.313 に答える
6

私ならこのように書きます

public static String[] names() {

    java.util.LinkedList<String> list = new LinkedList<String>();
    for (State s : State.values()) {
        list.add(s.name());
    }

    return list.toArray(new String[list.size()]);
}
于 2014-04-04T11:55:31.250 に答える
4

別の方法:

最初の1つ

Arrays.asList(FieldType.values())
            .stream()
            .map(f -> f.toString())
            .toArray(String[]::new);

他の方法

Stream.of(FieldType.values()).map(f -> f.toString()).toArray(String[]::new);
于 2017-08-10T08:39:01.010 に答える
3

次のようなことができます:

public static String[] names() {
  String[] names = new String[values().length];
  int index = 0;

  for (State state : values()) {
    names[index++] = state.name();
  }

  return names;
}

ドキュメントでは、ほとんどの場合toString()の代わりに をname()使用することを推奨していますが、ここで名前を明示的に要求しています。

于 2012-12-09T00:15:24.463 に答える
2

文字列の操作を伴う私の解決策(最速ではありませんが、コンパクトです):

public enum State {
    NEW,
    RUNNABLE,
    BLOCKED,
    WAITING,
    TIMED_WAITING,
    TERMINATED;

    public static String[] names() {
        String valuesStr = Arrays.toString(State.values());
        return valuesStr.substring(1, valuesStr.length()-1).replace(" ", "").split(",");
    }
}
于 2012-12-09T03:25:49.153 に答える
2

私はこのようにします(ただし、おそらく名前を配列ではなく変更不可能なセットにするでしょう):

import java.util.Arrays;
enum State {
    NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED;
    public static final String[] names=new String[values().length];
    static {
        State[] values=values();
        for(int i=0;i<values.length;i++)
            names[i]=values[i].name();
    }
}
public class So13783295 {
    public static void main(String[] args) {
        System.out.println(Arrays.asList(State.names));
    }
}
于 2012-12-09T01:07:40.740 に答える
2

通常の方法(しゃれた意図):

String[] myStringArray=new String[EMyEnum.values().length];
for(EMyEnum e:EMyEnum.values())myStringArray[e.ordinal()]=e.toString();
于 2016-09-15T01:29:32.483 に答える
1

私は同じ必要性を持っており、汎用メソッドを使用しています (ArrayUtils クラス内):

public static <T> String[] toStringArray(T[] array) {
    String[] result=new String[array.length];
    for(int i=0; i<array.length; i++){
        result[i]=array[i].toString();
    }
    return result;
}

そして、列挙型内で STATIC を定義するだけです...

public static final String[] NAMES = ArrayUtils.toStringArray(values());

Java 列挙型には、names() メソッドと get(index) メソッドがありません。これらは非常に役に立ちます。

于 2015-04-07T05:09:34.380 に答える
0

考えてみてください: 列挙型の値を文字列の配列として返すメソッドを作成する必要はないかもしれません。

なぜ文字列の配列が必要なのですか? 値を変換する必要がある場合は、値を使用するときにのみ変換する必要があるかもしれません。

例:

for (State value:values()) {
    System.out.println(value); // Just print it.
}

for (State value:values()) {
    String x = value.toString(); // Just iterate and do something with x.
}

// If you just need to print the values:
System.out.println(Arrays.toString(State.values()));
于 2012-12-09T03:53:28.393 に答える
0

これを試して:

public static String[] vratAtributy() {
    String[] atributy = new String[values().length];
    for(int index = 0; index < atributy.length; index++) {
        atributy[index] = values()[index].toString();
    }
    return atributy;
}
于 2015-05-18T15:48:33.220 に答える
0

最短にしたい場合は、試すことができます

public static String[] names() {
    String test = Arrays.toString(values());
    return text.substring(1, text.length()-1).split(", ");
}
于 2012-12-09T00:28:39.380 に答える
0

Kotlinに対するボヘミアンの答えに基づいています:

replace()の代わりに使用しreplaceAll()ます。

Arrays.toString(MyEnum.values()).replace(Regex("^.|.$"), "").split(", ").toTypedArray()

補足:たとえば、.toTypedArray()で使用するために に変換しAlertDialogます。setSingleChoiceItems

于 2021-02-20T03:19:37.937 に答える