You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"
)
解决方案

可以通过以下步骤实现需求:

  1. 随机抽取4组键值对:利用shuffled()打乱原map的键值对列表,再取前4个实现随机选择。
  2. 分离键与值:从选中的4组中提取键列表和值列表。
  3. 错位打乱值列表:确保打乱后的列表中,没有值回到原键对应的位置,再重新配对成新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 21:55:26