2011-11-13 3 views
10

que vous avez un enum avec quelques élémentsComment randomiser des éléments enum?

public enum LightColor { 
    RED, YELLOW, GREEN 
} 

et que vous souhaitez choisir au hasard la couleur de celui-ci.

je mettre des couleurs dans un

public List<LightColor> lightColorChoices = new ArrayList<LightColor>(); 

lightColorChoices.add(LightColor.GREEN); 
lightColorChoices.add(LightColor.YELLOW); 
lightColorChoices.add(LightColor.RED); 

Et puis ramassé une couleur au hasard comme:

this.lightColor = lightColorChoices.get((int) (Math.random() * 3)); 

Tout cela (tout en travaillant bien) semble inutilement compliqué. Existe-t-il un moyen plus simple de choisir un élément enum aléatoire?

+0

en tant que votre développeur pour un nombre aléatoire? ... non désolé. – ic3

+0

question connexe: http://stackoverflow.com/questions/5269250/random-value-from-enum-with-probability –

+0

Je pense que celui-ci est plus proche du problème à la main (indice: recherchez la réponse trashgod): http : //stackoverflow.com/questions/1972392/java-pick-a-random-value-from-an-enum – DPM

Répondre

22

les énumérations de Java sont en fait des objets entièrement capables. Vous pouvez ajouter une méthode à la déclaration enum

public enum LightColor { 
    Green, 
    Yellow, 
    Red; 

    public static LightColor getRandom() { 
     return values()[(int) (Math.random() * values().length)]; 
    } 
} 

qui vous permettra de l'utiliser comme ceci:

LightColor randomLightColor = LightColor.getRandom(); 
+0

C'est très cool – JAM

+0

Merci! , il fonctionne comme un charme!!! – Taber

0

Vous pouvez associer un ID entier à chaque couleur d'énumération et posséder une méthode valueOf (int id) qui renvoie la couleur correspondante. Cela vous aidera à vous débarrasser de la liste ..

Tiberiu

7
LightColor random = LightColor.values()[(int)(Math.random()*(LightColor.values().length))]; 
5

Utilisez Enum.values() pour obtenir toutes les options disponibles et utiliser la méthode Random.nextInt() spécifiant la valeur maximale. par exemple:

private static Random numberGenerator = new Random(); 
public <T> T randomElement(T[] elements) 
    return elements[numberGenerator.nextInt(elements.length)]; 
} 

Cela peut ensuite être appelé en tant que tel:

LightColor randomColor = randomElement(LightColor.values()); 
+0

+1 pour suggérer Random.nextInt() au lieu de multiplier par la taille – Jorn

3

Cela devrait juste être facile, comme indiqué ci-dessous

LightColor[] values = LightColor.values(); 
LightColor value = values[(int) (Math.random() * 3)]; 
0

lecture donc la réponse de Kowser, je suis venu avec quelque chose. Étant donnée une ChatColor enum contenant des couleurs différentes, vous pouvez effectuer les opérations suivantes:

private ChatColor getRandomColor() { 
    ChatColor randomColor = ChatColor.values()[random.nextInt(ChatColor 
      .values().length - 1)]; 
    ChatColor[] blacklist = { ChatColor.BOLD, ChatColor.ITALIC, 
      ChatColor.MAGIC, ChatColor.RESET, ChatColor.STRIKETHROUGH, 
      ChatColor.UNDERLINE }; 
    while (Arrays.asList(blacklist).contains(randomColor)) { 
     randomColor = ChatColor.values()[random 
       .nextInt(ChatColor.values().length)]; 
    } 
    return randomColor; 
} 

et même une liste noire.