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

Flutter Dart中嵌套for循环逻辑错误,求修正方案

问题分析与解决方案

原代码的核心问题

内层循环只对比了list2的第一个元素——只要当前itemI和list2第一个元素name不匹配,就直接把itemI塞进list4并跳出循环,完全没检查list2里剩下的元素有没有匹配项。举个例子:如果list1里的itemI和list2第三个元素name匹配,但和第一个不匹配,原代码会错误地把它丢进list4。

正确的实现方式

方式一:修正嵌套循环逻辑

先默认当前itemI不匹配,遍历完list2所有元素后再判断归类:

List<Model1> list3 = [];
List<Model1> list4 = [];

for (Model1 itemI in list1) {
  bool foundMatch = false;
  for (Model2 itemJ in list2) {
    if (itemI.name == itemJ.name) {
      foundMatch = true;
      break; // 找到匹配就停止内层循环,不用继续遍历
    }
  }
  foundMatch ? list3.add(itemI) : list4.add(itemI);
}

方式二:用集合提升效率(推荐)

先把list2的所有name提取到Set里,判断匹配的速度会快很多,适合数据量大的场景:

// 先把list2的name全部提取出来存到集合
Set<String> list2NameSet = list2.map((item) => item.name).toSet();

List<Model1> list3 = [];
List<Model1> list4 = [];

for (Model1 item in list1) {
  if (list2NameSet.contains(item.name)) {
    list3.add(item);
  } else {
    list4.add(item);
  }
}

方式三:用Dart内置方法简化代码

直接用where和whereNot筛选,代码更简洁:

Set<String> list2NameSet = list2.map((item) => item.name).toSet();

List<Model1> list3 = list1.where((item) => list2NameSet.contains(item.name)).toList();
List<Model1> list4 = list1.whereNot((item) => list2NameSet.contains(item.name)).toList();

内容的提问来源于stack exchange,提问作者user2297679

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:01:09