web-dev-qa-db-ja.com

列挙内のすべての名前をString []として取得

列挙型要素の名前をStringsの配列として取得するための最も簡単な方法および/または最短の方法は何ですか?

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

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

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

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

86
Konstantin

更新:

Java 8では、ストリームを使用する任意の列挙型クラスの1行です。

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

Java 7では、少しエレガントではありませんが、このワンライナーがトリックを行います。

public static String[] names() {
    return Arrays.toString(State.values()).replaceAll("^.|.$", "").split(", ");
}

また、これはany enumで機能するバージョンです。

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 too
78
Bohemian

名前の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;
}
62
PermGenError

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

EnumUtils.getEnumList(State.class)

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

11

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

public static String[] names() {
    return Stream.of(State.values()).map(State::name).toArray(String[]::new);
}
10
Kris Boyd

Java 8の場合:

Arrays.stream(MyEnum.values()).map(Enum::name)
                    .collect(Collectors.toList()).toArray();
9
Yura Galavay

このように書きます

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()]);
}
5
Raymond Chenon

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

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()を使用することを推奨しています ですが、ここで名前を明示的に要求しています。

3
Dave Webb

文字列の操作を使用した私のソリューション(最速ではありませんが、コンパクトです):

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(",");
    }
}
2
ceklock

別の方法:

最初の1つ

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

他の方法

Stream.of(FieldType.values()).map(f -> f.toString()).toArray(String[]::new);
2
Durgpal Singh

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

String[] myStringArray=new String[EMyEnum.values().length];
for(EMyEnum e:EMyEnum.values())myStringArray[e.ordinal()]=e.toString();
1
Aquarius Power

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

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));
    }
}
1
Ray Tayek

同じニーズがあり、(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;
}

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

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

Java列挙型は、names()メソッドとget(index)メソッドを実際に見逃しているため、非常に役立ちます。

1
marcolopes

@Bohemianのソリューションで少しテストを行いました。代わりに単純なループを使用すると、パフォーマンスが向上します。

public static <T extends Enum<?>> String[] getEnumNames(Class<T> inEnumClass){
    T [] values = inEnumClass.getEnumConstants();
    int len = values.length;
    String[] names = new String[len];
    for(int i=0;i<values.length;i++){
        names[i] = values[i].name();
    }
    return names;
}

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

org.Apache.commons.lang3.EnumUtils.getEnumMap(State.class).keySet()

0
wutzebaer

これを試して:

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;
}
0
Matiseli

Java 7以前でそれを行う別の方法は、グアバを使用することです。

public static String[] names() {
    return FluentIterable.from(values()).transform(Enum::name).toArray(String.class);
}
0
Justin Lee

考えてみてください。多分、enumの値を文字列の配列として返すメソッドを作成する必要はありません。

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

例:

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()));
0
ceklock

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

public static String[] names() {
    String test = Arrays.toString(values());
    return text.substring(1, text.length()-1).split(", ");
}
0
Peter Lawrey