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

Dart 中如何从Map中获取多个随机值并转为List使用?

实现方案

核心实现逻辑

你需要先导入Dart内置的随机数库,核心实现思路是:

  • 先做参数合法性校验,避免取值数量超出列表范围等异常
  • 生成列表索引的随机排序结果,取前N个索引来获取对应元素,保证取到的随机值不重复
  • 支持前置条件筛选,只有符合条件的元素才会进入随机取值池,避免不需要的元素进入后续处理

完整可运行代码

import 'dart:math';

class Test{
  String url;
  int id;
  String name;
  Test({required this.url , required this.id , required this.name});
}

class Fake{
  static List<Test> getSomeValues = [
    Test(id: 1 , url : "test/test" , name : "1Name"),
    Test(id: 2 , url : "test/test" , name : "2Name"),
    Test(id: 3 , url : "test/test" , name : "3Name"),
  ]; 
}

void widget(Test t){
  print(t.id);
}

/// 从源列表中取出指定数量的随机元素,支持前置条件筛选
/// [source] 源数据列表
/// [count] 要取的随机元素数量
/// [filter] 可选筛选条件,符合条件的元素才会进入随机池
List<Test> getRandom(List<Test> source, int count, {bool Function(Test)? filter}) {
  // 参数合法性校验
  if (count <= 0) return [];
  // 应用筛选条件得到可选取值池
  List<Test> availableList = filter == null ? source : source.where(filter).toList();
  if (availableList.isEmpty) return [];
  // 取值数量不能超过可选池长度,自动修正实际取值数量
  int actualCount = count > availableList.length ? availableList.length : count;
  // 生成索引列表并打乱顺序
  List<int> indexes = List.generate(availableList.length, (i) => i)..shuffle(Random());
  // 取前N个索引对应的元素返回
  return indexes.take(actualCount).map((i) => availableList[i]).toList();
}

void main(){
  // 示例1:无筛选条件,取2个随机值
  List<Test> randomList = getRandom(Fake.getSomeValues, 2);
  // 输出对应的id,示例输出结果为 3,1
  print(randomList.map((e) => e.id).join(','));
  // 调用你原有widget方法处理每个实例
  randomList.map((e) => widget(e)).toList();

  // 示例2:带筛选条件,仅在id>1的元素中取1个随机值
  List<Test> filteredRandom = getRandom(Fake.getSomeValues, 1, filter: (t) => t.id > 1);
  print(filteredRandom.map((e) => e.id).join(','));
}

方案说明

  • 可选filter参数兼容你原有的条件筛选需求,只有符合条件的元素才会进入随机取值池,不会出现不需要的元素进入后续处理
  • 内置边界校验,避免取值数量超过可选列表长度、取值数量为负等异常情况
  • 采用索引打乱的方式取值,保证不会取到重复元素
  • 返回值为List<Test>类型,你可以直接遍历使用每个Test实例,适配你原有后续处理逻辑

内容的提问来源于stack exchange,提问作者Mo7ammed 7amad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:18:03