Jeśli mam takie wyliczenie:
public enum Letter {
A,
B,
C,
//...
}
Jaki jest najlepszy sposób na losowe wybranie jednego? Nie musi być kuloodporna, ale dość równa dystrybucja byłaby miła.
Mógłbym zrobić coś takiego
private Letter randomLetter() {
int pick = new Random().nextInt(Letter.values().length);
return Letter.values()[pick];
}
Ale czy jest lepszy sposób? Czuję, że jest to coś, co zostało już wcześniej rozwiązane.
Letter.values()
musi tworzyć nową kopię wewnętrznejLetter
tablicy wartości.Odpowiedzi:
Jedyne, co zasugerowałbym, to buforowanie wyniku,
values()
ponieważ każde wywołanie kopiuje tablicę. Nie twórz też zaRandom
każdym razem. Zatrzymaj jeden. Poza tym to, co robisz, jest w porządku. Więc:źródło
values()
tablicy na niemodyfikowalną listę.VALUES
Obiekt jest już zamknięty na mocy zadeklarowaneprivate
. Byłoby prostsze i wydajniejsze, aby to zrobićprivate static final Letter[] VALUES = ...
.Jedna metoda to wszystko, czego potrzebujesz do wszystkich losowych wyliczeń:
Którego użyjesz:
Wolę też używać SecureRandom jako:
źródło
Łącząc sugestie Cletus i Helios ,
Edit: Ups, zapomniałem parametr typu ograniczone,
<E extends Enum<E>>
.źródło
E extends Enum<E>
?new RandomEnum<>(Season.class)
jest to dozwolone od wersji Java 7.RandomEnum
klasa byłaby fajna jako mikro biblioteka, gdybyś chciał ją spakować i opublikować w centrali.Pojedyncza linia
źródło
Zgadzam się ze Stphenem C & heliosem. Lepszym sposobem na pobranie losowego elementu z Enum jest:
źródło
źródło
Jest to prawdopodobnie najbardziej zwięzły sposób na osiągnięcie celu, wystarczy zadzwonić,
Letter.getRandom()
a otrzymasz losową literę wyliczenia.źródło
Proste rozwiązanie Kotlin
random()
jest domyślną funkcją rozszerzającą zawartą w bazie Kotlin naCollection
obiekcie. Link do dokumentacji KotlinJeśli chcesz to uprościć za pomocą funkcji rozszerzenia, spróbuj tego:
Aby uczynić go statycznym w klasie wyliczenia. Pamiętaj, aby zaimportować
my.package.random
plik wyliczeniowyJeśli musisz to zrobić z instancji wyliczenia, wypróbuj to rozszerzenie
źródło
Prawdopodobnie najłatwiej jest mieć funkcję, która wybiera losową wartość z tablicy. Jest to bardziej ogólne i łatwe do wywołania.
Zadzwoń tak:
źródło
Tutaj wersja, która używa odtwarzania losowego i strumieni
źródło
Jeśli zrobisz to do testowania można użyć QuickCheck ( to jest port Java Pracuję na ).
Obsługuje wszystkie typy pierwotne, skład typów, kolekcje, różne funkcje dystrybucji, granice itp. Obsługuje elementy uruchamiające wykonujące wiele wartości:
Zaletą Quickcheck jest to, że można definiować testy na podstawie specyfikacji, w której zwykły TDD działa ze scenariuszami.
źródło
Łatwiej jest zaimplementować losową funkcję na wyliczeniu.
a potem dzwonisz z klasy, w której potrzebujesz tego w ten sposób
źródło
Użyłbym tego:
źródło
Wydaje mi się, że ta metoda powrotu w jednym wierszu jest na tyle skuteczna, że można jej użyć w tak prostej pracy:
źródło