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;
}
}
클래스에는 배열 내부에 저장된 자체 값이 있으며 배열을 사용하여 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의 영향을 많이받습니다.
I recently had the same problem and used the solution provided by Harry Joy. That solution only works with with zero-based enumaration though. I also wouldn't consider it save as it doesn't deal with indexes that are out of range.
The solution I ended up using might not be as simple but it's completely save and won't hurt the performance of your code even with big enums:
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;
}
}
If you are sure that you will never be out of range with your index and you don't want to use UNKNOWN
like I did above you can of course also do:
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' 카테고리의 다른 글
Ruby는 객체 키를 배열로 가져옵니다. (0) | 2020.09.04 |
---|---|
변수 값이 변경 될 때 이벤트를 트리거하는 방법은 무엇입니까? (0) | 2020.09.04 |
스프링에 정적 필드를 자동으로 연결할 수없는 이유 (0) | 2020.09.04 |
presentViewController : animated : YES보기는 사용자가 다시 탭할 때까지 표시되지 않습니다. (0) | 2020.09.04 |
Bootstrap datepicker 선택 후 숨기기 (0) | 2020.09.04 |