열거 형의 모든 이름을 String []으로 가져 오기
열거 형 요소의 이름을 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에서는 스트림을 사용하는 임의의 열거 형 클래스에 대한 한 줄입니다.
public static String[] getNames(Class<? extends Enum<?>> e) {
return Arrays.stream(e.getEnumConstants()).map(Enum::name).toArray(String[]::new);
}
자바 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
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()
하지만 여기에서 이름을 명시 적으로 요청했습니다.
다른 방법 :
첫 번째
Arrays.asList(FieldType.values())
.stream()
.map(f -> f.toString())
.toArray(String[]::new);
다른 방법
Stream.of(FieldType.values()).map(f -> f.toString()).toArray(String[]::new);
내 솔루션, 문자열 조작 (가장 빠르지는 않지만 간결함) :
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(",");
}
}
나는 이런 식으로 그것을 할 것입니다 (그러나 나는 아마도 이름을 배열 대신 수정할 수없는 세트로 만들 것입니다) :
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;
}
그리고 열거 형 안에 STATIC을 정의하십시오.
public static final String[] NAMES = ArrayUtils.toStringArray(values());
Java 열거 형에는 실제로 names () 및 get (index) 메서드가 누락되어 정말 유용합니다.
일반적인 방법 (의도 된 말장난) :
String[] myStringArray=new String[EMyEnum.values().length];
for(EMyEnum e:EMyEnum.values())myStringArray[e.ordinal()]=e.toString();
I did a bit test on @Bohemian's solution. The performance is better when using naive loop instead.
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);
}
If you want the shortest you can try
public static String[] names() {
String test = Arrays.toString(values());
return text.substring(1, text.length()-1).split(", ");
}
Just a thought: maybe you don't need to create a method to return the values of the enum as an array of strings.
Why do you need the array of strings? Maybe you only need to convert the values when you use them, if you ever need to do that.
Examples:
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()));
org.apache.commons.lang3.EnumUtils.getEnumMap(State.class).keySet()
Another way to do it in Java 7 or earlier would be to use Guava:
public static String[] names() {
return FluentIterable.from(values()).transform(Enum::name).toArray(String.class);
}
Try this:
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;
}
참고URL : https://stackoverflow.com/questions/13783295/getting-all-names-in-an-enum-as-a-string
'programing' 카테고리의 다른 글
WebKit, FireBug 또는 IE8 Developer Tool과 같은 일부 디버거에서 동적 로딩 JavaScript를 디버깅 할 수 있습니까? (0) | 2020.09.09 |
---|---|
Twitter 부트 스트랩 다단계 드롭 다운 메뉴 (0) | 2020.09.09 |
Maven 릴리스 플러그인을 사용하는 동안 "Git fatal : ref HEAD는 기호 참조가 아닙니다." (0) | 2020.09.09 |
사용자가받은 모든 권한을 어떻게 나열 할 수 있습니까? (0) | 2020.09.09 |
xpath를 사용하여 다음 형제 / xml 태그를 선택하는 방법 (0) | 2020.09.09 |