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
相关产品推荐
相关产品推荐

