Java - Obtenir un élément / élément aléatoire dans une liste

1. Introduction

Choisir un élément Liste aléatoire est une opération très basique mais pas si évidente à implémenter. Dans cet article, nous montrerons la manière la plus efficace de le faire dans différents contextes.

2. Choisir un / des éléments aléatoires

Afin d'obtenir un élément aléatoire à partir d'une instance de List , vous devez générer un numéro d'index aléatoire, puis récupérer un élément par ce numéro d'index généré à l'aide de la méthode List.get () .

Le point clé ici est de vous rappeler que vous ne devez pas utiliser un index qui dépasse la taille de votre liste .

2.1. Élément aléatoire unique

Afin de sélectionner un index aléatoire, vous pouvez utiliser la méthode Random.nextInt (int lié) :

public void givenList_shouldReturnARandomElement() { List givenList = Arrays.asList(1, 2, 3); Random rand = new Random(); int randomElement = givenList.get(rand.nextInt(givenList.size())); }

Au lieu de la classe Random , vous pouvez toujours utiliser la méthode statique Math.random () et la multiplier par la taille de la liste ( Math.random () génère une double valeur aléatoire entre 0 (inclus) et 1 (exclusif), alors n'oubliez pas de le convertir en int après multiplication).

2.2. Sélectionnez un index aléatoire dans un environnement multithread

Lors de l'écriture d'applications multithread à l'aide de l' instance de classe aléatoire unique , cela peut entraîner la sélection de la même valeur pour chaque processus accédant à cette instance. Nous pouvons toujours créer une nouvelle instance par thread en utilisant une classe ThreadLocalRandom dédiée :

int randomElementIndex = ThreadLocalRandom.current().nextInt(listSize) % givenList.size();

2.3. Sélectionnez des éléments aléatoires avec des répétitions

Parfois, vous voudrez peut-être choisir quelques éléments dans une liste. C'est assez simple:

public void givenList_whenNumberElementsChosen_shouldReturnRandomElementsRepeat() { Random rand = new Random(); List givenList = Arrays.asList("one", "two", "three", "four"); int numberOfElements = 2; for (int i = 0; i < numberOfElements; i++) { int randomIndex = rand.nextInt(givenList.size()); String randomElement = givenList.get(randomIndex); } }

2.4. Sélectionnez des éléments aléatoires sans répétitions

Ici, vous devez vous assurer que cet élément est supprimé de la liste après la sélection:

public void givenList_whenNumberElementsChosen_shouldReturnRandomElementsNoRepeat() { Random rand = new Random(); List givenList = Lists.newArrayList("one", "two", "three", "four"); int numberOfElements = 2; for (int i = 0; i < numberOfElements; i++) { int randomIndex = rand.nextInt(givenList.size()); String randomElement = givenList.get(randomIndex); givenList.remove(randomIndex); } }

2.5. Sélectionnez une série aléatoire

Si vous souhaitez obtenir des séries aléatoires d'éléments, la classe d'utils Collections peut être pratique:

public void givenList_whenSeriesLengthChosen_shouldReturnRandomSeries() { List givenList = Lists.newArrayList(1, 2, 3, 4, 5, 6); Collections.shuffle(givenList); int randomSeriesLength = 3; List randomSeries = givenList.subList(0, randomSeriesLength); }

3. Conclusion

Dans cet article, nous avons étudié la façon la plus efficace d'aller chercher des éléments aléatoires à partir d' une liste instanc e pour différents scénarios .

Des exemples de code peuvent être trouvés sur GitHub.