从 DART 中的列表中提取常见元素



我有 3 个列表,例如:

List l1 = [1, 2, 3, 55, 7, 99, 21];
List l2 = [1, 4, 7, 65, 99, 20, 21];
List l3 = [0, 2, 6, 7, 21, 99, 26];

我期待共同的元素:

// [7,99,21]

这是我尝试过但无法正常工作的方法:

List l1 = [1, 2, 3, 55, 7, 99, 21];
List l2 = [1, 4, 7, 65, 99, 20, 21];
List l3 = [0, 2, 6, 7, 21, 99, 26];
List common = l1;
l2.forEach((element) {
l3.forEach((element2) {
if (!common.contains(element) || !common.contains(element2)) {
common.remove(element);
common.remove(element2);
}
});
});
print(common);

另外,列表的数量是动态的,所以我希望像这样嵌套它们,我没有递归经验,所以我无法做到这一点,甚至不知道它是否比嵌套循环更好。

感谢您的帮助。

你不需要嵌套循环或递归。Dart在Lists上具有Sets和非常好的fold方法。

main() {
final lists = [
[1, 2, 3, 55, 7, 99, 21],
[1, 4, 7, 65, 99, 20, 21],
[0, 2, 6, 7, 21, 99, 26]
];
final commonElements =
lists.fold<Set>(
lists.first.toSet(), 
(a, b) => a.intersection(b.toSet()));
print(commonElements);
}

给:

{7, 99, 21}

此外,无论lists中包含多少个列表,都可以使用此方法。

一种解决方案:

void main() {
List l1 = [1, 2, 3, 55, 7, 99, 21];
List l2 = [1, 4, 7, 65, 99, 20, 21];
List l3 = [0, 2, 6, 7, 21, 99, 26];
l1.removeWhere((item) => !l2.contains(item));
l1.removeWhere((item) => !l3.contains(item));
print(l1);
}

结果:

[7, 99, 21]

如果列表数是动态的,则解决方案是计算所有列表中的所有出现次数,并仅保留出现次数等于列表数的值:

void main() {
List<List> lists = [
[1, 2, 3, 55, 7, 99, 21],
[1, 4, 7, 65, 99, 20, 21],
[0, 2, 6, 7, 21, 99, 26]
];
Map map = Map();
for (List l in lists) {
l.forEach((item) => map[item] = map.containsKey(item) ? (map[item] + 1) : 1);
}
var commonValues = map.keys.where((key) => map[key] == lists.length);
print(commonValues);
}

结果:

(7, 99, 21(

一个用于复制和粘贴到项目中的函数:

List<T> intersection<T>(Iterable<Iterable<T>> iterables) {
return iterables
.map((e) => e.toSet())
.reduce((a, b) => a.intersection(b))
.toList();
}
final commonElements = intersection(lists);

以防万一,如果你想使用嵌套循环。

void main() {
List l1 = [1, 2, 3, 55, 7, 99, 21];
List l2 = [1, 4, 7, 65, 99, 20, 21];
List l3 = [0, 2, 6, 7, 21, 99, 26];
List result = [];
for (final e1 in l1) {
for (final e2 in l2) {
for (final e3 in l3) {
if (e1 == e2 && e1 == e3) {
result.add(e1);
}
}
}
}
print(result);
}

或者你可以做:

List l1 = [1, 2, 3, 55, 7, 99, 21];
List l2 = [1, 4, 7, 65, 99, 20, 21];
List l3 = [0, 2, 6, 7, 21, 99, 26];

List uniqueItemsList = l1
.toSet()
.where((x) => l2.toSet().contains(x))
.where((x) => l3.toSet().contains(x))
.toList();

print(uniqueItemsList); //[7, 99, 21]
void main(){
List l1 = [1, 2, 3, 55, 7, 99, 21];
List l2 = [1, 4, 7, 65, 99, 20, 21];
List l3 = [0, 2, 6, 7, 21, 99, 26];
print(Set.from(l1).intersection(Set.from(l2)).intersection(Set.from(l3)).toList());
}

最新更新