Wenn ich eine Aufzählung wie diese habe:
public enum Letter {
A,
B,
C,
//...
}
Was ist der beste Weg, um eine zufällig auszuwählen? Es muss nicht kugelsicher in Produktionsqualität sein, aber eine ziemlich gleichmäßige Verteilung wäre schön.
Ich könnte so etwas tun
private Letter randomLetter() {
int pick = new Random().nextInt(Letter.values().length);
return Letter.values()[pick];
}
Aber gibt es einen besseren Weg? Ich denke, das ist etwas, das schon einmal gelöst wurde.
Letter.values()
eine neue Kopie des internenLetter
Wertearrays erstellt werden muss.Antworten:
Das einzige, was ich vorschlagen würde, ist das Zwischenspeichern des Ergebnisses,
values()
da jeder Aufruf ein Array kopiert. Erstellen Sie auch nichtRandom
jedes Mal ein. Behalte einen. Davon abgesehen ist das, was Sie tun, in Ordnung. So:quelle
values()
Array in eine nicht modifizierbare Liste umzuwandeln . DasVALUES
Objekt ist bereits durch Deklaration gekapseltprivate
. Es wäre einfacher UND effizienter, es zu machenprivate static final Letter[] VALUES = ...
.Eine einzige Methode ist alles, was Sie für alle Ihre zufälligen Aufzählungen benötigen:
Welche Sie verwenden werden:
Ich bevorzuge es auch, SecureRandom zu verwenden als:
quelle
Die Vorschläge von Cletus und Helios kombinieren ,
Edit: Ups, ich habe den begrenzten Typparameter vergessen
<E extends Enum<E>>
.quelle
E extends Enum<E>
?new RandomEnum<>(Season.class)
seit Java 7 erlaubt ist.RandomEnum
Klasse wäre als Mikrobibliothek gut geeignet, wenn Sie sie bündeln und in der Zentrale veröffentlichen möchten.Einzelne Zeile
quelle
Stimmen Sie mit Stphen C & Helios überein. Der bessere Weg, um zufällige Elemente aus Enum abzurufen, ist:
quelle
quelle
Dies ist wahrscheinlich der prägnanteste Weg, um Ihr Ziel zu erreichen. Sie müssen nur anrufen
Letter.getRandom()
und erhalten einen zufälligen Aufzählungsbrief.quelle
Es ist wahrscheinlich am einfachsten, eine Funktion zu haben, um einen zufälligen Wert aus einem Array auszuwählen. Dies ist allgemeiner und einfach aufzurufen.
Rufen Sie so an:
quelle
Hier eine Version, die Shuffle und Streams verwendet
quelle
Einfache Kotlin-Lösung
random()
ist eine Standarderweiterungsfunktion, die in Base Kotlin für dasCollection
Objekt enthalten ist. Kotlin-DokumentationslinkWenn Sie es mit einer Erweiterungsfunktion vereinfachen möchten, versuchen Sie Folgendes:
Um es in Ihrer Enum-Klasse statisch zu machen. Stellen Sie sicher, dass Sie
my.package.random
in Ihre Aufzählungsdatei importierenWenn Sie dies von einer Instanz der Aufzählung aus tun müssen, versuchen Sie diese Erweiterung
quelle
Wenn Sie dies zum Testen tun, können Sie Quickcheck verwenden ( dies ist ein Java-Port, an dem ich gearbeitet habe ).
Es unterstützt alle primitiven Typen, Typzusammensetzungen, Sammlungen, verschiedene Verteilungsfunktionen, Grenzen usw. Es unterstützt Läufer, die mehrere Werte ausführen:
Der Vorteil von Quickcheck besteht darin, dass Sie Tests basierend auf einer Spezifikation definieren können, bei der einfaches TDD mit Szenarien arbeitet.
quelle
Es ist einfacher, eine Zufallsfunktion für die Aufzählung zu implementieren.
und dann rufst du es aus der Klasse an, die du so brauchst
quelle
Ich würde dies verwenden:
quelle
Ich denke, dass diese Single-Line-Return-Methode effizient genug ist, um in einem so einfachen Job verwendet zu werden:
quelle