以 String []形式获取枚举中的所有名称

String数组的形式获得枚举元素名称的最简单和/或最短的方法是什么?

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

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


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

names()方法将返回数组 { "NEW", "RUNNABLE", "BLOCKED", "WAITING", "TIMED_WAITING", "TERMINATED" }

173647 次浏览

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

Something like this would do:

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, but you have explicitly asked for the name here.

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

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

我会这样做(但是我可能会使名字成为一个不可修改的集合而不是一个数组) :

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

下面是 enum课程的一句俏皮话:

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

Pre Java8仍然是一行程序,尽管不那么优雅:

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

If you just want something simple for a hard-coded enum class:

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

我的解决方案是操作字符串(不是最快的,但很紧凑) :

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

只是一个想法: 也许您不需要创建一个方法来以字符串数组的形式返回枚举的值。

为什么需要字符串数组?也许您只需要在使用这些值时转换它们,如果您需要这样做的话。

例子:

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() {


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


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

用 java 8:

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

我也有同样的需求,并且使用了一个泛型方法(在 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 枚举实际上缺少 name ()和 get (index)方法,它们非常有用。

试试这个:

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

如果你可以使用 Java8,这个工作很好(替代 Yura 的建议,更有效率) :

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

下面是一个使用 Apache Commons Lang 3的优雅解决方案:

EnumUtils.getEnumList(State.class)

虽然它返回一个 List,但是您可以使用 list.toArray()轻松地转换该 List

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

普通方式(双关语) :

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

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

另一种方式:

第一个

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

另一边

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

在 Java7或更早版本中实现这一点的另一种方法是使用 Guava:

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

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

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


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


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

最简单的方法:

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

类别在哪里是 Enum名称

Very similar to the accepted answer, but since I learnt about EnumSet, I can't help but use it everywhere. So for a tiny bit more succinct (Java8) answer:

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

有个简单的解决办法

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

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

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

此实现不需要额外的“函数”和“字段”。只需添加此函数即可得到所需的结果。

基于波西米亚人对科特林的回答:

使用 replace()代替 replaceAll()

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

附注: 例如,在 AlertDialogsetSingleChoiceItems中使用转换为 .toTypedArray()

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

您不需要使用 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;
}