Подтвердить что ты не робот

Получение всех имен в перечислении в виде строки []

Какой самый простой и/или самый короткий способ получить имена элементов перечисления в виде массива String s?

Я имею в виду, что если бы, например, у меня было следующее перечисление:

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

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

метод names() возвращает аналоговый массив с { "NEW", "RUNNABLE", "BLOCKED", "WAITING", "TIMED_WAITING", "TERMINATED" }.

4b9b3361

Ответ 1

Обновление:

В java 8 это одна строка для произвольного класса enum с использованием потока:

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

Кроме того, здесь версия этого, которая будет работать для любого перечисления:

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

Ответ 2

Создайте массив 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;
}

Ответ 3

Если вы можете использовать Java 8, это работает хорошо (альтернатива предложению Yura, более эффективная):

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

Ответ 4

Вот элегантное решение, использующее Apache commons-lang3:

EnumUtils.getEnumList(State.class)

Хотя он возвращает список, вы можете легко преобразовать список с помощью list.toArray()

Ответ 5

С помощью java 8:

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

Ответ 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()]);
}

Ответ 8

Мое решение, с манипуляцией строками (не самым быстрым, но компактным):

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

Ответ 9

Другие способы:

Первый

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

Другой способ

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

Ответ 10

Я сделал бы это так (но я бы, вероятно, сделал имена немодифицируемым набором вместо массива):

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

Ответ 11

У меня такая же потребность и используйте общий метод (внутри класса 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 внутри enum...

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

Java перечисления действительно пропускают методы names() и get (index), они действительно полезны.

Ответ 12

обычный способ (каламбур):

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

Ответ 13

Я немного тестировал решение @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 solution
public static String[] getNames(Class<? extends Enum<?>> e) {
    return Arrays.stream(e.getEnumConstants()).map(Enum::name).toArray(String[]::new);
}

Ответ 14

Если вы хотите кратчайший, вы можете попробовать

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

Ответ 15

Просто мысль: возможно, вам не нужно создавать метод для возврата значений 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()));

Ответ 16

Попробуй это:

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

Ответ 17

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

Ответ 18

Другой способ сделать это в Java 7 или более ранней версии - использовать Guava:

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

Ответ 19

Просто используйте: List<Something> somethingList = Arrays.asList(Something.values());