128 votes

L'obtention de tous les noms dans un enum comme un String[]

Quelle est la méthode la plus simple et/ou voie la plus courte possible pour obtenir les noms des enum éléments d'un tableau d' Strings?

Ce que je veux dire par là, c'est que si, par exemple, j'ai eu l'enum ci-dessous:

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

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

l' names() méthode retourne un tableau analogique - { "NEW", "RUNNABLE", "BLOCKED", "WAITING", "TIMED_WAITING", "TERMINATED" }.

130voto

Bohemian Points 134107

Ce one-liner est le tour est joué:

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

Aussi, voici une version de ce qui va travailler pour toute enum:

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

Que vous appelez la comme ceci:

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

65voto

PermGenError Points 26936

Créer un String[] tableau pour obtenir le nom et l'appeler le statique values() méthode qui renvoie toutes les valeurs enum, puis effectuer une itération sur les valeurs et de remplir les noms de tableau.

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

6voto

raychenon Points 1068

Je voudrais écrire comme ceci

public static String[] names() {

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

    return list.toArray(new String[list.size()]);
}

3voto

Dave Webb Points 90034

Quelque chose comme cela ferait:

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

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

  return names;
}

La documentation recommande l'utilisation d' toString() au lieu de name() dans la plupart des cas, mais vous avez explicitement demandé pour le nom ici.

2voto

Ray Tayek Points 4635

j'aimerais faire de cette façon (mais je serais probablement faire un nom inmodifiable de jeu au lieu d'un tableau):

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X