Android Kotlin:从对象类HashMap随机选4组并打乱键值映射
问题描述
我声明了一个名为ImageStore的object类,其中的imagesNamesMap包含5组键值对。我需要从中随机选取4组键值对,再将这4组的键与值随机重新配对(要求没有键对应原来的原值,如示例所示)。
当前代码
object ImageStore { val imagesNamesMap= hashMapOf( R.drawable.africa to "Africa", R.drawable.asia to "Asia", R.drawable.europe to "Europe", R.drawable.antartica to "Antarctica", R.drawable.airplane to "Airplane" ) val selectedImagesNamesMap = imagesNamesMap.toList().take(4).toMap() }
期望效果示例
// 随机选中的4组 val random4 = hashMapOf( R.drawable.africa to "Africa", R.drawable.asia to "Asia", R.drawable.europe to "Europe", R.drawable.airplane to "Airplane" ) // 重新配对后的结果(无原键值对应) val shuffledMap = hashMapOf( R.drawable.africa to "Asia", R.drawable.asia to "Africa", R.drawable.europe to "Airplane", R.drawable.airplane to "Europe" )
解决方案
可以通过以下步骤实现需求:
- 随机抽取4组键值对:利用
shuffled()打乱原map的键值对列表,再取前4个实现随机选择。 - 分离键与值:从选中的4组中提取键列表和值列表。
- 错位打乱值列表:确保打乱后的列表中,没有值回到原键对应的位置,再重新配对成新map。
完整实现代码:
object ImageStore { val imagesNamesMap= hashMapOf( R.drawable.africa to "Africa", R.drawable.asia to "Asia", R.drawable.europe to "Europe", R.drawable.antartica to "Antarctica", R.drawable.airplane to "Airplane" ) fun generateShuffledMap(): Map<Int, String> { // 1. 随机选取4组键值对 val randomPairs = imagesNamesMap.toList().shuffled().take(4) val keys = randomPairs.map { it.first } val originalValues = randomPairs.map { it.second } // 2. 生成错位打乱的值列表(无原键值对应) var shuffledValues = originalValues.shuffled() while (keys.zip(shuffledValues).any { (key, value) -> imagesNamesMap[key] == value }) { shuffledValues = shuffledValues.shuffled() } // 3. 重新配对成新map return keys.zip(shuffledValues).toMap() } }
代码说明
shuffled():Kotlin标准库方法,会随机打乱集合顺序,保证每次运行选中的4组都是随机的。- 错位检查:通过
zip将键和打乱后的值配对,遍历检查是否存在与原map一致的键值对,若有则重新打乱,直到得到符合要求的结果。 zip()与toMap():将键列表和值列表按顺序配对,转换为新的Map对象。
内容的提问来源于stack exchange,提问作者klaus19
相关产品推荐
相关产品推荐

