使用kotlin流从列表中获取随机项目

时间:2017-12-16 21:33:22

标签: random kotlin

如何以简单明了的方式从列表中获取随机项目 例如:如果我想从这个列表中得到一个偶数的随机数。

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

注意:
我知道java中有一些类似的答案可以解决这个问题,但我认为我们可以在kotlin中有一个更简洁的方法。

5 个答案:

答案 0 :(得分:17)

自Kotlin 1.2以来,我们有Iterable.shuffled()。此方法可以帮助您使用List.take()来提取所需的元素数量(在此示例中只有一个)。

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

此方法不如Humazed方法优化,但它适用于多平台上下文,并且更灵活。

修改

计划在Kotlin 1.3-M1标准库中使用Random对象,有关此内容的更多信息:https://github.com/Kotlin/KEEP/blob/random/proposals/stdlib/random.md

编辑2:

现在可以在Kotlin 1.3-M1的预览版中使用多平台随机数生成器。有关此内容的更多信息:https://blog.jetbrains.com/kotlin/2018/07/see-whats-coming-in-kotlin-1-3-m1/

编辑3:

Kotlin 1.3现在可用于Multiplatform随机数生成器! 您可以像这样使用它:

import kotlin.random.Random

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

Try it online!

或在你的情况下

import kotlin.random.Random

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

Try it online!

答案 1 :(得分:14)

我认为最简单,最简洁的方法是创建一个返回随机元素的扩展函数,以便可以这样使用:

val random = list.random()

扩展功能:

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

感谢@Francesco评论这是另一个将Random实例作为随机源的函数

/**
 * 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

答案 2 :(得分:5)

Shuffling the whole list just to get a single random number is a waste of performance.

Use random() instead which was introduced in Kotin 1.3

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

For your special use-case it would make sense to first filter the list and choose a random number from the remaining items.

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

答案 3 :(得分:1)

正如其他人所述,list.random()现在应该可以解决问题,但是如果您不知道列表是否为空,.random()可能会引发异常。除了将.randomOrNull()实现为扩展功能之外,您还可以使用list.shuffled().firstOrNull()对其进行破解,但是请注意,对于长列表来说,这样做很慢。

.randomOrNull()方法:

fun <E> List<E>.randomOrNull(): E? = if (size > 0) random() else null

答案 4 :(得分:0)

好吧,我尝试了很多方法,但是没有用,但是我开始对rundom()snd这样做,从我的列表中选择25个项目,像这样

    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)
     } 

现在您可以在我的suliTraffic列表中找到25个随机对象