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;
}
}
클래스에는 배열 내부에 저장된 자체 값이 있으며 배열을 사용하여 indexposition에서 열거 형을 가져옵니다. 위에서 언급했듯이 배열은 0부터 계산하기 시작합니다. 인덱스가 ‘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를 마지막 국가로 설정합니다 (이 경우에는 countries.KENTUCKY).
개체를 가져 오기 위해 하드 코딩 된 인덱스를 사용하는 경우이 코드는 ArrayOutOfBoundsExceptions의 영향을 많이받습니다.
답변
나는 최근에 같은 문제가 있었고 Harry Joy가 제공 한 솔루션을 사용했습니다. 이 솔루션은 0 기반 enumaration에서만 작동합니다. 또한 범위를 벗어난 인덱스를 처리하지 않기 때문에 저장이라고 생각하지 않습니다.
내가 사용한 솔루션은 그렇게 간단하지는 않지만 완전히 저장되며 큰 열거 형으로도 코드의 성능을 손상시키지 않습니다.
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);
}