Programing

Java의 인덱스에서 Enum 값을 얻는 방법은 무엇입니까?

lottogame 2020. 9. 4. 08:04
반응형

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

반응형