Si j'ai une énumération comme celle-ci:
public enum Letter {
A,
B,
C,
//...
}
Quelle est la meilleure façon d'en choisir un au hasard? Il n'a pas besoin d'être à l'épreuve des balles de qualité de production, mais une distribution assez uniforme serait bien.
Je pourrais faire quelque chose comme ça
private Letter randomLetter() {
int pick = new Random().nextInt(Letter.values().length);
return Letter.values()[pick];
}
Mais y a-t-il une meilleure façon? J'ai l'impression que c'est quelque chose qui a déjà été résolu.
Letter.values()
doit créer une nouvelle copie duLetter
tableau de valeurs interne .Réponses:
La seule chose que je suggérerais est de mettre en cache le résultat,
values()
car chaque appel copie un tableau. De plus, ne créez pas de fichier àRandom
chaque fois. Gardez-en un. A part ça, ce que vous faites est bien. Alors:la source
values()
tableau en une liste non modifiable. L'VALUES
objet est déjà encapsulé en raison de sa déclarationprivate
. Ce serait plus simple ET plus efficace de le faireprivate static final Letter[] VALUES = ...
.Une seule méthode est tout ce dont vous avez besoin pour toutes vos énumérations aléatoires:
Que vous utiliserez:
Je préfère également utiliser SecureRandom comme:
la source
Combinant les suggestions de cletus et helios ,
Edit: Oops, j'ai oublié le paramètre de type borné,
<E extends Enum<E>>
.la source
E extends Enum<E>
?new RandomEnum<>(Season.class)
c'est autorisé depuis Java 7.RandomEnum
classe unique serait bien comme une micro-bibliothèque, si vous vouliez la regrouper et la publier dans central.Une seule ligne
la source
D'accord avec Stphen C & helios. Le meilleur moyen d'extraire un élément aléatoire d'Enum est:
la source
la source
C'est probablement le moyen le plus concis d'atteindre votre objectif. Tout ce que vous avez à faire est d'appeler
Letter.getRandom()
et vous obtiendrez une lettre d'énumération aléatoire.la source
Solution Kotlin simple
random()
est une fonction d'extension par défaut incluse dans la base Kotlin sur l'Collection
objet. Lien vers la documentation KotlinSi vous souhaitez le simplifier avec une fonction d'extension, essayez ceci:
Pour le rendre statique sur votre classe enum. Assurez-vous d'importer
my.package.random
dans votre fichier enumSi vous devez le faire à partir d'une instance de l'énumération, essayez cette extension
la source
Il est probablement plus simple d'avoir une fonction pour choisir une valeur aléatoire dans un tableau. C'est plus générique et simple à appeler.
Appelez comme ça:
la source
Voici une version qui utilise shuffle et streams
la source
Si vous faites cela pour tester, vous pouvez utiliser Quickcheck ( c'est un port Java sur lequel j'ai travaillé ).
Il prend en charge tous les types primitifs, la composition de type, les collections, les différentes fonctions de distribution, les limites, etc. Il prend en charge les coureurs exécutant plusieurs valeurs:
L'avantage de Quickcheck est que vous pouvez définir des tests basés sur une spécification où le TDD simple fonctionne avec des scénarios.
la source
Il est facile d'implémenter une fonction aléatoire sur l'énumération.
et puis tu l'appelles depuis la classe dont tu as besoin comme ça
la source
J'utiliserais ceci:
la source
Je suppose que cette méthode de retour sur une seule ligne est suffisamment efficace pour être utilisée dans un travail aussi simple:
la source