열거형 내의 모든 이름을 문자열로 가져오기[ ]
열거 요소의 이름을 다음 배열로 가져오는 가장 쉽고/또는 가장 짧은 방법은 무엇입니까?String
s?
즉, 예를 들어 다음과 같은 열거형이 있는 경우입니다.
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 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;
}
언급URL : https://stackoverflow.com/questions/13783295/getting-all-names-in-an-enum-as-a-string
'programing' 카테고리의 다른 글
sql 1행에서 near "를 사용하는 올바른 구문 (0) | 2022.09.28 |
---|---|
Vue 플러그인의 일부로 Vuex 저장소에 돌연변이 추가 (0) | 2022.09.28 |
Python에서는 어떻게 문자를 정수로 변환하고 그 반대는 어떻게 해야 하나요? (0) | 2022.09.24 |
MySQL 쿼리의 IF 조건으로 카운트 (0) | 2022.09.24 |
특정 길이의 단어와 일치하도록 정규식 (0) | 2022.09.24 |