列挙型要素の名前をString
sの配列として取得するための最も簡単な方法および/または最短の方法は何ですか?
これが意味することは、たとえば、次の列挙型がある場合です。
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
public static String[] names() {
// ...
}
}
names()
メソッドは、{ "NEW", "RUNNABLE", "BLOCKED", "WAITING", "TIMED_WAITING", "TERMINATED" }
に類似した配列を返します。
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
名前の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;
}
Apache commons-lang3を使用したエレガントなソリューションを次に示します。
EnumUtils.getEnumList(State.class)
Listを返しますが、list.toArray()で簡単にリストを変換できます
Java 8を使用できる場合、これはうまく機能します(Yuraの提案の代替、より効率的):
public static String[] names() {
return Stream.of(State.values()).map(State::name).toArray(String[]::new);
}
Java 8の場合:
Arrays.stream(MyEnum.values()).map(Enum::name)
.collect(Collectors.toList()).toArray();
このように書きます
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()]);
}
次のようなことができます:
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()
を使用することを推奨しています ですが、ここで名前を明示的に要求しています。
文字列の操作を使用した私のソリューション(最速ではありませんが、コンパクトです):
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(",");
}
}
別の方法:
最初の1つ
Arrays.asList(FieldType.values())
.stream()
.map(f -> f.toString())
.toArray(String[]::new);
他の方法
Stream.of(FieldType.values()).map(f -> f.toString()).toArray(String[]::new);
通常の方法(意図したしゃれ):
String[] myStringArray=new String[EMyEnum.values().length];
for(EMyEnum e:EMyEnum.values())myStringArray[e.ordinal()]=e.toString();
私はこのようにします(ただし、おそらく名前を配列ではなく変更不可能なセットにします):
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));
}
}
同じニーズがあり、(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)メソッドを実際に見逃しているため、非常に役立ちます。
@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);
}
org.Apache.commons.lang3.EnumUtils.getEnumMap(State.class).keySet()
これを試して:
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;
}
Java 7以前でそれを行う別の方法は、グアバを使用することです。
public static String[] names() {
return FluentIterable.from(values()).transform(Enum::name).toArray(String.class);
}
考えてみてください。多分、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()));
最短にしたい場合は試すことができます
public static String[] names() {
String test = Arrays.toString(values());
return text.substring(1, text.length()-1).split(", ");
}