Na ciência da computação, os índices começam em 0, não em 1 ;-)
fredoverflow
1
Você tem certeza que quer? Geralmente, você não deve tocar no ordinal, a não ser implementar estruturas de dados de baixo nível (e então, usar mecanismos alternativos, como nome, para persistência).
Tom Hawtin - tackline
Você também poderia ter usado as constantes na classe java.util.Calendar. Eles são numerados de 0 a 11 para janeiro a dezembro. Cuidado com o 12, pois é o mês de dezembro (algo a ver com o calendário lunar). Mas estou apenas curioso para saber por que reinventar a roda de constantes de mês que já vem "estoque" no JRE?
Chris Aldrich
2FredOverflow: Concordo, usei a indexação errada. 2Tom Hawtin: Sim, tenho certeza. Eu persisto os dados com alguma estrutura e recebo o índice inteiro, não o enum. 2Chris Aldrich: Este é apenas um exemplo simulado que não corresponde ao caso real.
jk_
A propósito, o Java 8 e posterior vem com um Monthenum integrado.
Observe que clonará uma cópia da matriz de valores a cada vez, portanto, se você estiver chamando isso no loop interno do código sensível ao desempenho, você pode querer fazer uma cópia estática e usá-la.
Christopher Barber,
1
Estou confuso, então por que não gostaria de usar uma matriz em vez disso?
Anudeep Samaiya
@AnudeepSamaiya pode ser que queiramos usar constantes enum adequadas (Months.JAN) no código em vez de meses [1] em todos os lugares.
Harry Joy,
@Christopher Barber aqui está uma linha para "fazer uma cópia estática" public static final ArrayList<Months> ALL = new ArrayList<Month>() {{ for (Months m : Months.values()) add(m); }};Months i = ALL.get(index)
:,
Seria mais fácil simplesmente usar Months.values (). Clone () ou se você estiver paranóico sobre a mutabilidade envolvê-la em uma lista imutável (consulte Coleções)
A classe tem seus próprios valores salvos dentro de uma matriz, e eu uso a matriz para obter o enum na posição de índice. Como mencionado acima, as matrizes começam a contar a partir de 0, se você quiser que seu índice comece em '1', basta alterar estes dois métodos para:
Recentemente tive o mesmo problema e usei a solução fornecida por Harry Joy. Essa solução só funciona com enumaration baseado em zero. Eu também não consideraria isso salvo, pois não lida com índices que estão fora do intervalo.
A solução que acabei usando pode não ser tão simples, mas é totalmente salva e não prejudica o desempenho do seu código, mesmo com grandes enums:
Month
enum integrado.Respostas:
Tente isto
fonte
public static final ArrayList<Months> ALL = new ArrayList<Month>() {{ for (Months m : Months.values()) add(m); }};
Months i = ALL.get(index)
Aqui estão três maneiras de fazer isso.
fonte
public static
mutável (array e nãofinal
). Euw. EIllegalArgumentException
faria muito mais sentido do que devolver umanull
bomba.Eu apenas tentei o mesmo e encontrei a seguinte solução:
A classe tem seus próprios valores salvos dentro de uma matriz, e eu uso a matriz para obter o enum na posição de índice. Como mencionado acima, as matrizes começam a contar a partir de 0, se você quiser que seu índice comece em '1', basta alterar estes dois métodos para:
Dentro do meu principal eu obtenho os países-objeto necessários com
que define currCountry como o último país, neste caso countries.KENTUCKY.
Lembre-se de que este código é muito afetado por ArrayOutOfBoundsExceptions se você estiver usando indicadores codificados para obter seus objetos.
fonte
Recentemente tive o mesmo problema e usei a solução fornecida por Harry Joy. Essa solução só funciona com enumaration baseado em zero. Eu também não consideraria isso salvo, pois não lida com índices que estão fora do intervalo.
A solução que acabei usando pode não ser tão simples, mas é totalmente salva e não prejudica o desempenho do seu código, mesmo com grandes enums:
Se você tem certeza de que nunca estará fora do intervalo de seu índice e não deseja usar
UNKNOWN
como fiz acima, você também pode fazer:fonte