Kotlin实现:为列表每行填充1-90范围内的5个不重复数字
问题描述
我有一个包含3行的列表:
private val line1 = mutableListOf<Int>() private val line2 = mutableListOf<Int>() private val line3 = mutableListOf<Int>() val card = mutableListOf(line1, line2, line3)
需要为每行填充1到90之间的5个不重复数字,该如何实现?
我尝试用Flow实现,但每行的数字都完全相同,没法正常工作。我只需要每行有5个不重复的数字就行。原有尝试代码如下:
class Card { private val line1 = mutableListOf<Int>() private val line2 = mutableListOf<Int>() private val line3 = mutableListOf<Int>() val card = mutableListOf(line1, line2, line3) init { runBlocking { launch { Generator.flow.collect { card.forEach { line -> line.add(it) } } } } } }
解决方案
问题原因
你原来的代码里,Flow每次发射一个数字时,都会把这个数字添加到所有行里,所以每行内容完全一致,不符合需求。
方法一:直接生成(无需Flow)
如果不需要依赖Flow,最简单的方式是为每行单独生成5个1-90的不重复随机数字:
class Card { private val line1 = generateUniqueNumbers() private val line2 = generateUniqueNumbers() private val line3 = generateUniqueNumbers() val card = listOf(line1, line2, line3) private fun generateUniqueNumbers(): List<Int> { // 打乱1-90的数字顺序,取前5个即为不重复随机数 return (1..90).shuffled().take(5) } }
方法二:用Flow实现(若必须用Flow)
如果一定要基于Flow实现,需要为每行单独订阅独立的数字流,而非将同一个数字批量添加到所有行:
class Card { private val line1 = mutableListOf<Int>() private val line2 = mutableListOf<Int>() private val line3 = mutableListOf<Int>() val card = mutableListOf(line1, line2, line3) init { runBlocking { // 为每行单独启动收集任务,限定只收集5个数字 launch { generateNumberFlow().take(5).collect { line1.add(it) } } launch { generateNumberFlow().take(5).collect { line2.add(it) } } launch { generateNumberFlow().take(5).collect { line3.add(it) } } } } // 生成1-90的不重复随机数字流 private fun generateNumberFlow(): Flow<Int> { return flow { (1..90).shuffled().forEach { emit(it) } } } }
内容的提问来源于stack exchange,提问作者Den
相关产品推荐
相关产品推荐

