반응형
Java에서 인덱스에서 Enum 값을 가져오려면 어떻게 해야 합니까?
Java에 열거가 있습니다.
public enum Months
{
JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC
}
예를 들어 인덱스별로 열거형 값에 액세스하려고 합니다.
Months(1) = JAN;
Months(2) = FEB;
...
어떻게 하면 좋을까요?
이거 드셔보세요
Months.values()[index]
세 가지 방법이 있습니다.
public enum Months {
JAN(1), FEB(2), MAR(3), APR(4), MAY(5), JUN(6), JUL(7), AUG(8), SEP(9), OCT(10), NOV(11), DEC(12);
int monthOrdinal = 0;
Months(int ord) {
this.monthOrdinal = ord;
}
public static Months byOrdinal2ndWay(int ord) {
return Months.values()[ord-1]; // less safe
}
public static Months byOrdinal(int ord) {
for (Months m : Months.values()) {
if (m.monthOrdinal == ord) {
return m;
}
}
return null;
}
public static Months[] MONTHS_INDEXED = new Months[] { null, JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC };
}
import static junit.framework.Assert.assertEquals;
import org.junit.Test;
public class MonthsTest {
@Test
public void test_indexed_access() {
assertEquals(Months.MONTHS_INDEXED[1], Months.JAN);
assertEquals(Months.MONTHS_INDEXED[2], Months.FEB);
assertEquals(Months.byOrdinal(1), Months.JAN);
assertEquals(Months.byOrdinal(2), Months.FEB);
assertEquals(Months.byOrdinal2ndWay(1), Months.JAN);
assertEquals(Months.byOrdinal2ndWay(2), Months.FEB);
}
}
저도 같은 방법으로 다음과 같은 해결책을 생각해 냈습니다.
public enum Countries {
TEXAS,
FLORIDA,
OKLAHOMA,
KENTUCKY;
private static Countries[] list = Countries.values();
public static Countries getCountry(int i) {
return list[i];
}
public static int listGetLastIndex() {
return list.length - 1;
}
}
클래스에는 배열 내에 저장된 자체 값이 있으며 배열을 사용하여 인덱스 위치에 열거를 가져옵니다.위에서 설명한 바와 같이 인덱스를 '1'부터 시작하려면 이 두 가지 방법을 다음과 같이 변경하십시오.
public static String getCountry(int i) {
return list[(i - 1)];
}
public static int listGetLastIndex() {
return list.length;
}
메인 내에서는 필요한 국가를 입수할 수 있습니다.
public static void main(String[] args) {
int i = Countries.listGetLastIndex();
Countries currCountry = Countries.getCountry(i);
}
currCountry를 마지막 국가(이 경우 국가)로 설정합니다.켄터키.
하드코드된 표시를 사용하여 객체를 가져오는 경우 이 코드는 ArrayOfBoundsExceptions의 영향을 많이 받습니다.
저는 최근에 같은 문제를 겪었고 해리 조이가 제공한 해결책을 사용했습니다.이 솔루션은 제로 베이스 열거에서만 작동합니다.범위를 벗어난 인덱스는 취급하지 않기 때문에 세이브라고는 생각하지 않습니다.
결국 사용한 솔루션은 간단하지 않을 수 있지만 완전히 저장되므로 큰 에넘을 사용하더라도 코드 성능을 저하시키지 않습니다.
public enum Example {
UNKNOWN(0, "unknown"), ENUM1(1, "enum1"), ENUM2(2, "enum2"), ENUM3(3, "enum3");
private static HashMap<Integer, Example> enumById = new HashMap<>();
static {
Arrays.stream(values()).forEach(e -> enumById.put(e.getId(), e));
}
public static Example getById(int id) {
return enumById.getOrDefault(id, UNKNOWN);
}
private int id;
private String description;
private Example(int id, String description) {
this.id = id;
this.description= description;
}
public String getDescription() {
return description;
}
public int getId() {
return id;
}
}
인덱스를 사용할 수 있는 범위를 벗어나는 일이 없으며, 이 옵션을 사용하지 않으려는 경우UNKNOWN
위에서 했던 것처럼 당신도 물론 할 수 있습니다.
public static Example getById(int id) {
return enumById.get(id);
}
언급URL : https://stackoverflow.com/questions/6692664/how-to-get-enum-value-from-index-in-java
반응형
'programing' 카테고리의 다른 글
Java 소스 파일의 일부를 Kotlin으로 변환하려면 어떻게 해야 합니까? (0) | 2022.09.30 |
---|---|
NaN 값을 확인하려면 어떻게 해야 하나요? (0) | 2022.09.30 |
JavaScript를 사용하여 이미지의 실제 폭과 높이를 확인하시겠습니까?(Safari/Chrome) (0) | 2022.09.23 |
상태 배열에서 항목을 삭제하는 방법 (0) | 2022.09.23 |
MySQL 테이블의 열 크기를 수정하려면 어떻게 해야 합니까? (0) | 2022.09.23 |