ฉันมี enum ใน Java:
public enum Months
{
JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC
}
ฉันต้องการเข้าถึงค่า enum ด้วยดัชนีเช่น
Months(1) = JAN;
Months(2) = FEB;
...
ฉันจะทำอย่างไร
ฉันมี enum ใน Java:
public enum Months
{
JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC
}
ฉันต้องการเข้าถึงค่า enum ด้วยดัชนีเช่น
Months(1) = JAN;
Months(2) = FEB;
...
ฉันจะทำอย่างไร
Month
enum ในตัว
คำตอบ:
ลองทำตามนี้
Months.values()[index]
public static final ArrayList<Months> ALL = new ArrayList<Month>() {{ for (Months m : Months.values()) add(m); }};
จากนั้นคุณสามารถเข้าถึงองค์ประกอบได้ด้วยMonths i = ALL.get(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 static
ไม่แน่นอน (ทั้งอาร์เรย์และไม่final
) อู้ว. และIllegalArgumentException
จะมีเหตุผลมากกว่าการคืนnull
ระเบิด
ฉันเพิ่งลองแบบเดียวกันและหาวิธีแก้ปัญหาต่อไปนี้:
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;
}
}
คลาสมีค่าของตัวเองที่บันทึกไว้ในอาร์เรย์และฉันใช้อาร์เรย์เพื่อรับ enum ที่ indexposition ดังที่กล่าวไว้ข้างต้นอาร์เรย์จะเริ่มนับจาก 0 หากคุณต้องการให้ดัชนีของคุณเริ่มจาก '1' เพียงแค่เปลี่ยนสองวิธีนี้เป็น:
public static String getCountry(int i) {
return list[(i - 1)];
}
public static int listGetLastIndex() {
return list.length;
}
ภายใน Main ของฉันฉันได้รับประเทศ - วัตถุที่จำเป็นด้วย
public static void main(String[] args) {
int i = Countries.listGetLastIndex();
Countries currCountry = Countries.getCountry(i);
}
ซึ่งตั้งค่า currCountry เป็นประเทศสุดท้ายในกรณีนี้คือ Countries.KENTUCKY
เพียงจำไว้ว่ารหัสนี้ได้รับผลกระทบอย่างมากจาก ArrayOutOfBoundsExceptions หากคุณใช้ตัวบ่งชี้ที่เข้ารหัสเพื่อรับวัตถุของคุณ
เมื่อเร็ว ๆ นี้ฉันมีปัญหาเดียวกันและใช้วิธีแก้ปัญหาที่ Harry Joy ให้มา โซลูชันนั้นใช้ได้เฉพาะกับการแจงนับแบบศูนย์เท่านั้น ฉันจะไม่คิดว่ามันประหยัดเพราะมันไม่ได้จัดการกับดัชนีที่อยู่นอกช่วง
วิธีแก้ปัญหาที่ฉันใช้อาจไม่ง่ายอย่างที่คิด แต่มันช่วยประหยัดได้อย่างสมบูรณ์และจะไม่ทำร้ายประสิทธิภาพของโค้ดของคุณแม้จะมี 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;
}
}
หากคุณแน่ใจว่าดัชนีของคุณจะไม่อยู่นอกขอบเขตและคุณไม่ต้องการใช้UNKNOWN
เหมือนที่ฉันทำข้างต้นแน่นอนคุณสามารถทำได้เช่นกัน:
public static Example getById(int id) {
return enumById.get(id);
}