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

如何在Dart中从两个列表创建包含重复共同元素的新列表?

Dart 保留重复元素的列表交集实现

需求很明确:从两个列表中提取共同元素,同时保留原列表A中重复出现的元素(比如A里有两个"dog",只要B里存在"dog",结果里就保留这两个)。

基础实现(简单直接)

直接遍历列表A,筛选出同时存在于列表B中的元素,保持原顺序:

List<String> A = ['cow','dog','cat','rat','dog'];
List<String> B = ['dog','horse','rat','bird'];

List<String> C = A.where((element) => B.contains(element)).toList();
print(C); // 输出: [dog, rat, dog]

优化版本(提升大列表效率)

如果列表B元素较多,contains方法每次查询是O(n)的时间复杂度,效率较低。可以先把B转成Set,利用Set的O(1)查询特性:

List<String> A = ['cow','dog','cat','rat','dog'];
List<String> B = ['dog','horse','rat','bird'];

Set<String> bElements = Set.from(B);
List<String> C = A.where((element) => bElements.contains(element)).toList();
print(C); // 输出: [dog, rat, dog]

进阶:限制匹配次数(按需选择)

如果你的实际需求是B中有多少个该元素,结果里就保留多少个(比如B里只有1个"dog",结果里只保留1个),可以用计数字典来实现:

List<String> A = ['cow','dog','cat','rat','dog'];
List<String> B = ['dog','horse','rat','bird'];

// 统计B中每个元素的出现次数
Map<String, int> bCount = {};
for (String item in B) {
  bCount[item] = (bCount[item] ?? 0) + 1;
}

List<String> C = [];
for (String item in A) {
  if (bCount.containsKey(item) && bCount[item] > 0) {
    C.add(item);
    bCount[item]--; // 匹配一次后减少计数
  }
}
print(C); // 输出: [dog, rat]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:23:26