programing

열거형 내의 모든 이름을 문자열로 가져오기[ ]

coolbiz 2022. 9. 28. 23:01
반응형

열거형 내의 모든 이름을 문자열로 가져오기[ ]

열거 요소의 이름을 다음 배열로 가져오는 가장 쉽고/또는 가장 짧은 방법은 무엇입니까?Strings?

즉, 예를 들어 다음과 같은 열거형이 있는 경우입니다.

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

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

names()메서드는 어레이를 반환합니다.{ "NEW", "RUNNABLE", "BLOCKED", "WAITING", "TIMED_WAITING", "TERMINATED" }.

여기 모든 것을 위한 원라이너입니다.enum클래스:

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

Java 8 이전 버전에서는 아직 원라이너에 불과하지만 우아하지는 않습니다.

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

하드 코드화된 열거형 클래스에 대해 간단한 내용을 원하는 경우:

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

작성하다String[]이름을 배열하고 staticvalues()모든 열거값을 반환하고 값을 반복하여 names 배열에 입력하는 메서드입니다.

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

Java 8을 사용할 수 있는 경우, 이 기능은 정상적으로 동작합니다(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.toArray()

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

다른 방법:

첫 번째 것

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

다른 방법이다.

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

다음과 같은 기능이 있습니다.

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

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

  return names;
}

매뉴얼에서는 대부분의 경우 대신 사용을 권장하고 있습니다만, 여기서 명시적으로 이름을 입력해 주세요.

심플한 솔루션 제공

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

다음과 같이 합니다(하지만 이름을 배열이 아닌 수정할 수 없는 집합으로 만들 수 있습니다).

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

스트링 조작이 가능한 솔루션(최고속은 아니지만 콤팩트):

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

통상적인 방법(표준 의도):

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

동일한 요구와 범용 메서드(Array Utils 클래스 내)를 사용하고 있습니다.

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

자바 enums는 names() 메서드와 get(index) 메서드를 놓치고 있어 매우 편리합니다.

나는 @Bohemian의 솔루션에 대해 약간의 테스트를 했다.대신 Naigive 루프를 사용하면 성능이 향상됩니다.

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

org.disc.disc.disc.discEnumUtils.getEnumMap(State.class).키 세트()

인정된 답변과 매우 비슷하지만, EnumSet에 대해 알게 되었기 때문에 어디에서나 사용할 수 밖에 없습니다.조금 더 간결한 답변(Java8)을 위해:

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

Enum::name으로 Enum String 값을 얻을 수 있습니다.

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

이 실장에서는, 추가의 「기능」과 「필드」는 필요 없습니다.이 기능을 추가하면 원하는 결과를 얻을 수 있습니다.

만약 당신이 가장 짧은 것을 원한다면, 당신은 시도할 수 있습니다.

public static String[] names() {
    String test = Arrays.toString(values());
    return text.substring(1, text.length()-1).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()));

Java 7 이전 버전에서는 Guava를 사용하는 방법도 있습니다.

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

이것을 시험해 보세요.

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

열거값을 문자열 목록에 넣고 배열로 변환할 수 있습니다.

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

서 Category는 " " " 입니다.Enum 표시

코틀린에 대한 보헤미안 답변에 근거해:

replace()replaceAll().

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

to : 환환환으로 .toTypedArray()에서 AlertDialog의 »setSingleChoiceItems

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

언급URL : https://stackoverflow.com/questions/13783295/getting-all-names-in-an-enum-as-a-string

반응형