20 votes

Obtenir un élément aléatoire de la liste en utilisant les flux kotlin

Comment obtenir un élément aléatoire d'une liste de manière simple et concise.
ex : si je veux obtenir un nombre aléatoire pair à partir de cette liste que.

val list = listOf(1, 2, 3, 4, 5, 6, 7, 9).filter { it % 2 == 0 }

Note :
Je sais qu'il y a des réponses similaires en Java qui résolvent ce problème mais je pense que nous pouvons avoir un moyen plus concis en Kotlin.

22voto

Valentin Michalak Points 1252

Depuis Kotlin 1.2, nous avons Iterable.shuffled() . Cette méthode pourrait vous aider à utiliser List.take() pour extraire le nombre d'éléments que vous souhaitez (un seul dans cet exemple).

val list = (1..9).filter { it % 2 == 0 }
return list.shuffled().take(1)[0]

Cette méthode est moins optimisée que celle de Humazed mais elle fonctionne dans un contexte multiplateforme et est plus flexible.


EDITAR:

A Random est prévu pour la bibliothèque standard de Kotlin 1.3-M1, plus d'informations à ce sujet ici : https://github.com/Kotlin/KEEP/blob/random/proposals/stdlib/random.md


EDIT 2 :

Le générateur de nombres aléatoires multiplateforme est maintenant disponible dans la preview de Kotlin 1.3-M1. Plus d'informations à ce sujet ici : https://blog.jetbrains.com/kotlin/2018/07/see-whats-coming-in-kotlin-1-3-m1/


EDIT 3 :

Kotlin 1.3 est maintenant disponible avec un générateur de nombres aléatoires multiplateforme ! Vous pouvez l'utiliser comme suit :

import kotlin.random.Random

fun main() {
    println(Random.nextBoolean())
    println(Random.nextInt())
}

Essayez-le en ligne !

ou dans votre cas

fun main() {
    val list = (1..9).filter { it % 2 == 0 }
    println(list.random())
}

Essayez-le en ligne !

16voto

humazed Points 398

Je pense que le moyen le plus simple et le plus concis est de créer une fonction d'extension qui renvoie un élément aléatoire afin de pouvoir l'utiliser de cette manière :

val random = list.random()

la fonction d'extension :

/**
 * Returns a random element.
 */
fun <E> List<E>.random(): E? = if (size > 0) get(Random().nextInt(size)) else null

grâce au commentaire de @Francesco voici une autre fonction qui prend une instance de Random comme source d'aléa

/**
 * Returns a random element using the specified [random] instance as the source of randomness.
 */
fun <E> List<E>.random(random: java.util.Random): E? = if (size > 0) get(random.nextInt(size)) else null

9voto

Willi Mentzel Points 7681

Mélanger toute la liste juste pour obtenir un seul numéro aléatoire est un gaspillage de performance.

Utilisez random() à la place qui a été introduit dans Kotin 1.3

val randomNumber = listOf(1, 6, 8).random()

Pour votre cas particulier, il serait judicieux de filtrer d'abord la liste et de choisir un numéro aléatoire parmi les éléments restants.

val randomEvenNumber = listOf(1, 2, 3, 4, 5, 6, 7, 9).filter { it % 2 == 0 }.random()

0voto

hardiBSalih Points 21

J'ai essayé de nombreuses façons, mais cela n'a pas fonctionné. J'ai commencé à faire ceci à rundom() et à sélectionner 25 éléments de ma liste.

    var suliTraffic = ArrayList<SuliTraffic>()
    var randomsuliTraffic = ArrayList<SuliTraffic>()
// I have add some data to my Array List
    randomsuliTraffic.add(new)

// Here i shuffle all the information i have wich is over 400 object
    randomsuliTraffic.shuffle()

// now you can just simply get 25 item from this randomsuliTraffic like this
     for (i in randomsuliTraffic.take(25)){
            suliTraffic.add(i)
     } 

Maintenant, vous pouvez trouver 25 objets aléatoires dans ma liste suliTraffic.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X