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

Dart中如何实现保留原列表顺序的稳定列表集合差运算

最优实现方案

核心思路是先将待排除的列表转换为Set实现O(1)复杂度的存在性判断,再单次遍历原列表过滤元素,既保证执行效率,又完全保留原列表的元素顺序。

方案1:生成新列表(不修改原list1)

void main() {
  List<String> list1 = ['foo', 'bar', 'blah', 'bee', 'fog'];
  List<String> list2 = ['bee', 'bar'];
  // 构建待排除元素的集合
  final excludeSet = Set.from(list2);
  // 过滤保留不在排除集合中的元素,原顺序完全不变
  final result = list1.where((item) => !excludeSet.contains(item)).toList();
  print(result); // 输出: [foo, blah, fog]
}

方案2:直接修改原list1

如果不需要保留原list1的内容,可以直接调用removeWhere方法修改原列表:

void main() {
  List<String> list1 = ['foo', 'bar', 'blah', 'bee', 'fog'];
  List<String> list2 = ['bee', 'bar'];
  final excludeSet = Set.from(list2);
  list1.removeWhere((item) => excludeSet.contains(item));
  print(list1); // 输出: [foo, blah, fog]
}

方案优势

  • 时间复杂度低:构建排除集合耗时O(m)(m为list2长度),遍历过滤耗时O(n)(n为list1长度),整体时间复杂度为O(n+m),远优于双重循环方案的O(n*m)
  • 顺序稳定:遍历顺序完全遵循list1的原有顺序,不会出现Set.difference方案打乱顺序的问题
  • 逻辑简洁:仅需单次遍历即可完成计算,代码可读性和可维护性更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:54:03