如何以简单明了的方式从列表中获取随机项目 例如:如果我想从这个列表中得到一个偶数的随机数。
val list = listOf(1, 2, 3, 4, 5, 6, 7, 9).filter { it % 2 == 0 }
注意:
我知道java中有一些类似的答案可以解决这个问题,但我认为我们可以在kotlin中有一个更简洁的方法。
答案 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())
}
或在你的情况下
import kotlin.random.Random
fun main() {
val list = (1..9).filter { it % 2 == 0 }
println(list.random())
}
答案 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个随机对象