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

