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

yx2lnoni  于 2023-03-13  发布在  Kotlin
关注(0)|答案(6)|浏览(269)

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

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

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

1yjd4xko

1yjd4xko1#

Kotlin1.3及以上版本:

**Kotlin1.3现在可用于多平台随机数生成器!**您可以这样使用它:

import kotlin.random.Random

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

Try it online!
或者你的情况

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

Try it online!
Kotlin1.2
从Kotlin1.2开始,我们有了Iterable.shuffled(),这个方法可以帮助你使用List.take()来提取你想要的元素数量(在这个例子中只有一个)。

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

这个方法没有1.2之前的方法优化,但是它可以在多平台环境下工作。根据你的环境使用你需要的方法。

在Kotlin1.2之前

在Kotlin1.2之前,没有在多平台上下文中生成随机数的解决方案,最简单的解决方案是直接调用Platform Random。

JVM

在JVM上,我们使用Random,如果JDK〉1.6,甚至使用ThreadLocalRandom

import java.util.Random

fun IntRange.random() = Random().nextInt((endInclusive + 1) - start) + start

JS

在JS上,我们使用Math.Random

fun IntRange.random() = (Math.random() * ((endInclusive + 1) - start) + start).toInt()
bd1hkmkf

bd1hkmkf2#

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

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
vsaztqbk

vsaztqbk3#

仅仅为了得到一个随机数而打乱整个列表是对性能的浪费。
使用Kotin 1.3中引入的random()代替

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

对于您的特殊用例,首先过滤列表并从剩余项中选择一个随机数是有意义的。

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

dsekswqp4#

正如其他人所说的,list.random()现在应该可以了,但是如果你不知道列表是否为空,.random()可能会抛出一个异常。除了将.randomOrNull()实现为扩展函数之外,你还可以使用list.shuffled().firstOrNull()来破解它,但是要注意,对于长列表来说,这是很慢的。
.randomOrNull()方法:

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

oxiaedzo5#

如果你想从一个列表中得到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个随机元素。

b4wnujal

b4wnujal6#

fun <E> List<E>.getRandomListElements(): List<E>? = if (isNotEmpty()) this.shuffled().take(Random.nextInt(size)) else null

相关问题