Flutter/Dart 如何从列表中获取两个不重复的随机元素(无需删除原列表元素)
两个零门槛实现方案(完全适配新手开发场景)
方案1:循环校验去重(改动量最小、逻辑最直白)
完全不需要修改原列表,只需要生成完第一个索引后,反复生成第二个索引直到和第一个不相等就行,几行改动就能解决问题:
var rnd = new Random(); int player1; int player2; void rndnbrs() { setState(() { player1 = rnd.nextInt(name.length); // 循环生成直到两个索引值不重复 do { player2 = rnd.nextInt(name.length); } while (player2 == player1); }); }
- 优势:全程不改动原
name列表的内容和顺序,不会影响其他依赖这个列表的代码逻辑 - 注意:只要列表长度大于等于2,这个循环永远会在1-2次判断内退出,不会有任何性能损耗,也不会出现死循环
方案2:列表打乱取前两位(代码最简洁)
Dart自带列表打乱的内置方法,完全不用自己写去重判断,也不用做删元素、插元素的冗余操作:
void rndnbrs() { setState(() { // 浅拷贝一份原列表再打乱,避免改动原列表的原有顺序 final shuffledList = List.of(name)..shuffle(rnd); player1 = name.indexOf(shuffledList[0]); player2 = name.indexOf(shuffledList[1]); }); }
提示:你当前的
name列表没有重复元素,用indexOf匹配原始列表的索引是完全准确的,不会出现匹配错值的问题。
关于你之前尝试的removeAt方案为什么行不通
删除元素生成新索引、再把元素插回原列表的逻辑很容易出bug:删除元素后列表长度变化、所有后续元素的索引会同步位移,很容易出现索引错位、元素插回位置不对的问题,完全没必要做这种容易出错的冗余操作。
内容的提问来源于stack exchange,提问作者Der Finn
相关产品推荐
相关产品推荐

