将枚举元素的名称作为String
s数组的最简单和/或最短的方法是什么?
我的意思是,例如,如果我有以下枚举:
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
public static String[] names() {
// ...
}
}
names()
方法会返回一个类似于{ "NEW", "RUNNABLE", "BLOCKED", "WAITING", "TIMED_WAITING", "TERMINATED" }
的数组。
答案 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 API 或 Apache 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()
以用于 AlertDialog
的 setSingleChoiceItems
。
答案 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());