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

