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

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

1. introduction

Choisir un élément aléatoireList est une opération très basique mais pas si évidente à implémenter. Dans cet article, nous allons montrer 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 deList, 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é en utilisant la méthodeList.get().

Le point clé ici est de vous rappeler que vous ne devez pas utiliser d’index qui dépasse votre capacitéList’s.

2.1. Élément aléatoire unique

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

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 classeRandom, vous pouvez toujours utiliser la méthode statiqueMath.random() et la multiplier par la taille de la liste (Math.random() génère une valeur aléatoire deDouble entre 0 (inclus) et 1 (exclusif) , alors n'oubliez pas de le convertir enint 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 uniqueRandom, 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 classeThreadLocalRandom 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 utilsCollections 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 exploré le moyen le plus efficace de récupérer des éléments aléatoires à partir d'une instanceListe pour différents scénarios.

Des exemples de code peuvent être trouvés surGitHub.