programing

열거 형의 모든 이름을 String []으로 가져 오기

nasanasas 2020. 9. 9. 08:05
반응형

열거 형의 모든 이름을 String []으로 가져 오기


열거 형 요소의 이름을 Strings 배열로 얻는 가장 쉽고 짧은 방법은 무엇입니까?

이것이 의미하는 바는 예를 들어 다음 열거 형이있는 경우입니다.

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

반응형