将枚举中的所有名称作为String []

时间:2012-12-09 00:06:02

标签: java arrays enums

将枚举元素的名称作为String s数组的最简单和/或最短的方法是什么?

我的意思是,例如,如果我有以下枚举:

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

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

names()方法会返回一个类似于{ "NEW", "RUNNABLE", "BLOCKED", "WAITING", "TIMED_WAITING", "TERMINATED" }的数组。

27 个答案:

答案 0 :(得分:74)

更新

在java 8中,它是使用流的任意枚举类的一行:

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

答案 1 :(得分:62)

为名称创建一个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;
}

答案 2 :(得分:10)

这是使用Apache commons-lang3:

的优雅解决方案
EnumUtils.getEnumList(State.class)

虽然它返回一个List,但您可以使用list.toArray()

轻松转换列表

答案 3 :(得分:10)

如果你可以使用Java 8,这很好用(替代Yura&#39的建议,效率更高):

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

答案 4 :(得分:8)

使用java 8:

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

答案 5 :(得分:5)

我会像这样写

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

答案 6 :(得分:3)

这样的事情可以做到:

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

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

  return names;
}

The documentation recommends using toString() instead of name() in most cases,但您已明确要求提供此名称。

答案 7 :(得分: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(",");
    }
}

答案 8 :(得分:2)

另一种方式:

第一个

id smownerid    smcreatorid
1  33997         1
2  33997         1
3  33997         1
4  33998         1
5  33998         1
6  33998         33998
7  33998         33998
8  33998         33998
9  33998         33998
10 33940         33998
11 33940         33998
12 3             33998
13 33940         1
14 33940         33998
15 33997         33997
16 3             33997
17 33940         33998

其他方式

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

答案 9 :(得分: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(索引)方法,它们确实非常有用。

答案 10 :(得分:1)

与接受的答案非常相似,但是由于我了解了EnumSet,所以我不禁在各处使用它。因此,对于更简洁的(Java8)答案:

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

答案 11 :(得分:1)

我这样做(但我可能会将名称设为不可修改的集合而不是数组):

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

答案 12 :(得分:1)

得到了简单的解决方案

Arrays.stream(State.values()).map(Enum::name).collect(Collectors.toList())

答案 13 :(得分:1)

通常的方式(双关语):

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

答案 14 :(得分:1)

我对@ 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);
}

答案 15 :(得分:0)

您不需要使用 Streams APIApache Commons 库。这里可以说是最简单、最快捷的方法:

public static String[] names() {
    String[] names = new String[State.values().length];
    State[] values = State.values();
    for (int i = 0, valuesLength = values.length; i < valuesLength; i++) {
        names[i] = values[i].toString();
    }
    return names;
}

答案 16 :(得分:0)

最简单的方法:

Category[] category = Category.values();
for (int i = 0; i < cat.length; i++) {
     System.out.println(i  + " - " + category[i]);
}

类别为Enum名称的地方

答案 17 :(得分:0)

您可以通过“Enum::name”获取Enum String值

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

这个实现不需要额外的“功能”和“字段”。只需添加此函数即可获得您想要的结果。

答案 18 :(得分:0)

基于 Bohemian 对 Kotlin 的回答:

使用 replace() 而不是 replaceAll()

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

旁注:例如,转换为 .toTypedArray() 以用于 AlertDialogsetSingleChoiceItems

答案 19 :(得分:0)

enum CardType {
    CLUB, DIAMOND, HEART, SPADE;

}

public class Control {
    public static void main(String[] args) {

        String[] cardsArray = new String[CardType.values().length];
        int i = 0;

        for (CardType cardType : CardType.values()){
            cardsArray[i] = cardType.name();
            i++;
        }
        //to output the array
        for (int j = 0; j < CardType.values().length; j++){
            System.out.println(cardsArray[j]);
        }
    }
}

答案 20 :(得分:0)

您可以将枚举值放入字符串列表并转换为数组:

    List<String> stateList = new ArrayList<>();

            for (State state: State.values()) {
                stateList.add(state.toString());
            }

    String[] stateArray = new String[stateList.size()];
    stateArray = stateList.toArray(stateArray);

答案 21 :(得分:0)

在Java 7或更早版本中执行此操作的另一种方法是使用Guava:

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

答案 22 :(得分:0)

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

答案 23 :(得分: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;
}

答案 24 :(得分: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()));

答案 25 :(得分:0)

如果你想要最短的话,你可以尝试

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

答案 26 :(得分:-1)

只需使用:List<Something> somethingList = Arrays.asList(Something.values());