2011-07-14 34 views
64

tengo una enumeración en Java:¿Cómo obtener Enum Value del índice en Java?

public enum Months 
{ 
    JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC 
} 

quiero acceder a los valores de enumeración por el índice, por ejemplo,

Months(1) = JAN; 
Months(2) = FEB; 
... 

¿Cómo debo hacer eso?

+7

En informática, los índices comienzan en 0, no en 1 ;-) – fredoverflow

+1

¿Estás seguro de que quieres? En general, no debe tocar el ordinal, aparte de implementar estructuras de datos de bajo nivel (y luego usar mecanismos alternativos, como el nombre, para la persistencia). –

+0

También podría haber usado las constantes en la clase java.util.Calendar también. Están numerados del 0 al 11 de enero a diciembre. Tenga cuidado con 12 ya que es diciembre (algo que tiene que ver con el calendario lunar). Pero estoy curioso por qué reinventar la rueda de constantes de mes que ya viene "en existencia" en el JRE. –

Respuesta

162

probar este

Months.values()[index] 
+26

Tenga en cuenta que se clonará una copia de la matriz de valores cada vez, por lo que si está llamando a esto en el bucle interno del código sensible al rendimiento, es posible que desee hacer una copia estática y usar eso. –

+0

Estoy confundido, entonces ¿por qué no quiero usar una matriz en su lugar? –

+0

@AnudeepSamaiya es posible que deseemos utilizar las constantes de enumeración adecuadas (Months.JAN) en el código en lugar de meses [1] en todas partes. –

7

Intente utilizar EnumMap o EnumSet?

+0

+1 de mi parte. Soluciona el problema probable en lugar de enviar el OP más lejos en la dirección incorrecta. –

+2

¿Podría explicar cómo esto resuelve el problema de recuperar un valor de tipo enum utilizando un índice (entero) como argumento? EnumMap requiere que la clave sea el tipo enum. –

+1

Eso es correcto. Esto no responde la pregunta en absoluto. –

17

Aquí hay tres maneras de hacerlo.

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); 
} 

} 
+3

'public static' mutable (both array y non-'final'). Euw. Y una 'IllegalArgumentException' tendría mucho más sentido que devolver una bomba' null'. –

+0

sí. Nunca dije que lo haría de esta manera. –

1

he intentado lo mismo y se le ocurrió siguiente solución:

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; 
    } 
} 

La clase tiene sus propios valores guardados dentro de una matriz, y utilizar la matriz para obtener la enumeración en indexposition. Como se mencionó anteriormente matrices comienzan a contar desde 0, si desea que su índice a partir de '1' basta con modificar estos dos métodos para:

public static String getCountry(int i) { 
    return list[(i - 1)]; 
} 

public static int listGetLastIndex() { 
    return list.length; 
} 

Dentro de mi principal consigo los países objeto sea necesario con

public static void main(String[] args) { 
    int i = Countries.listGetLastIndex(); 
    Countries currCountry = Countries.getCountry(i); 
} 

que establece currCountry en el último país, en este caso Countries.KENTUCKY.

Solo recuerde que este código se ve muy afectado por ArrayOutOfBoundsExceptions si está utilizando indicios codificados para obtener sus objetos.

Cuestiones relacionadas