W informatyce indeksy zaczynają się od 0, a nie od 1 ;-)
fredoverflow
1
Czy na pewno chcesz? Generalnie nie powinieneś dotykać liczby porządkowej, poza implementacją struktur danych niskiego poziomu (a następnie użyj alternatywnych mechanizmów, takich jak nazwa, dla trwałości).
Tom Hawtin - tackline
Mogłeś również użyć stałych w klasie java.util.Calendar. Są ponumerowane od 0 do 11 od stycznia do grudnia. Uważaj na 12, ponieważ jest to grudzień (ma to związek z kalendarzem księżycowym). Ale jestem po prostu ciekawy, po co ponownie wymyślać koło stałych miesięcznych, które jest już dostępne w środowisku JRE?
Chris Aldrich,
2FredOverflow: Zgadzam się, użyłem niewłaściwego indeksowania. Tom Hawtin: Tak, jestem pewien. Utrwalam dane w jakimś frameworku i otrzymuję indeks w postaci liczby całkowitej, a nie wyliczenia. 2Chris Aldrich: To tylko fikcyjny przykład, który nie pasuje do rzeczywistego przypadku.
jk_
Nawiasem mówiąc, Java 8 i nowsze mają Monthwbudowane wyliczenie.
Zauważ, że za każdym razem sklonuje kopię tablicy wartości, więc jeśli wywołujesz to w wewnętrznej pętli kodu wrażliwego na wydajność, możesz chcieć utworzyć kopię statyczną i użyć jej.
Christopher Barber
1
Jestem zdezorientowany, więc dlaczego nie miałbym zamiast tego używać tablicy?
Anudeep Samaiya
@AnudeepSamaiya może być, że chcemy używać właściwych stałych wyliczenia (Months.JAN) w kodzie zamiast miesięcy [1] wszędzie.
Harry Joy,
@Christopher Barber tutaj jest jednowierszowy sposób na „tworzenie statycznej kopii”: public static final ArrayList<Months> ALL = new ArrayList<Month>() {{ for (Months m : Months.values()) add(m); }};wtedy możesz uzyskać dostęp do elementów za pomocąMonths i = ALL.get(index)
muelleth
Byłoby łatwiej po prostu użyć Months.values (). Clone () lub jeśli masz paranoję na temat zmienności, aby zawinąć ją w niezmienną listę (patrz Kolekcje)
Klasa ma własne wartości zapisane w tablicy, a ja używam tablicy, aby uzyskać wyliczenie w pozycji indeksu. Jak wspomniano powyżej, tablice zaczynają liczyć od 0, jeśli chcesz, aby indeks zaczynał się od „1”, po prostu zmień te dwie metody na:
publicstaticvoid main(String[] args){int i =Countries.listGetLastIndex();Countries currCountry =Countries.getCountry(i);}
która ustawia currCountry na ostatni kraj, w tym przypadku Countries.KENTUCKY.
Pamiętaj tylko, że na ten kod mają duży wpływ wyjątki ArrayOutOfBoundsExceptions, jeśli używasz zakodowanych na stałe wskaźników do uzyskania obiektów.
Niedawno miałem ten sam problem i korzystałem z rozwiązania dostarczonego przez Harry'ego Joy. To rozwiązanie działa jednak tylko z wyliczaniem od zera. Nie uważałbym również, że jest zapisywany, ponieważ nie obsługuje indeksów, które są poza zakresem.
Rozwiązanie, którego użyłem, może nie być tak proste, ale jest całkowicie bezpieczne i nie zaszkodzi wydajności twojego kodu nawet przy dużych wyliczeniach:
Jeśli jesteś pewien, że nigdy nie wyjdziesz poza zakres swojego indeksu i nie chcesz używać go UNKNOWNtak, jak zrobiłem powyżej, możesz oczywiście również:
Month
wbudowane wyliczenie.Odpowiedzi:
Spróbuj tego
źródło
public static final ArrayList<Months> ALL = new ArrayList<Month>() {{ for (Months m : Months.values()) add(m); }};
wtedy możesz uzyskać dostęp do elementów za pomocąMonths i = ALL.get(index)
Oto trzy sposoby, aby to zrobić.
źródło
public static
mutable (zarówno tablicowe, jak i niefinal
). Euw. IIllegalArgumentException
miałoby to o wiele więcej sensu niż zwrotnull
bomby.Właśnie wypróbowałem to samo i znalazłem następujące rozwiązanie:
Klasa ma własne wartości zapisane w tablicy, a ja używam tablicy, aby uzyskać wyliczenie w pozycji indeksu. Jak wspomniano powyżej, tablice zaczynają liczyć od 0, jeśli chcesz, aby indeks zaczynał się od „1”, po prostu zmień te dwie metody na:
W moim Main dostaję potrzebne kraje-obiekt z
która ustawia currCountry na ostatni kraj, w tym przypadku Countries.KENTUCKY.
Pamiętaj tylko, że na ten kod mają duży wpływ wyjątki ArrayOutOfBoundsExceptions, jeśli używasz zakodowanych na stałe wskaźników do uzyskania obiektów.
źródło
Niedawno miałem ten sam problem i korzystałem z rozwiązania dostarczonego przez Harry'ego Joy. To rozwiązanie działa jednak tylko z wyliczaniem od zera. Nie uważałbym również, że jest zapisywany, ponieważ nie obsługuje indeksów, które są poza zakresem.
Rozwiązanie, którego użyłem, może nie być tak proste, ale jest całkowicie bezpieczne i nie zaszkodzi wydajności twojego kodu nawet przy dużych wyliczeniach:
Jeśli jesteś pewien, że nigdy nie wyjdziesz poza zakres swojego indeksu i nie chcesz używać go
UNKNOWN
tak, jak zrobiłem powyżej, możesz oczywiście również:źródło