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

Wal*_*azi 4 dart flutter

我有 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];
Run Code Online (Sandbox Code Playgroud)

我希望有共同的元素:

// [7,99,21]
Run Code Online (Sandbox Code Playgroud)

这是我尝试过但没有正常工作的内容:

 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);
Run Code Online (Sandbox Code Playgroud)

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

感谢您的帮助。

Ric*_*ler 13

为此,您不需要嵌套循环或递归。Dart 有Sets 和一个非常好的fold方法Lists

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);
}
Run Code Online (Sandbox Code Playgroud)

给出:

{7, 99, 21}

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


mik*_*ike 8

复制并粘贴到项目中的功能:

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);
Run Code Online (Sandbox Code Playgroud)


Yan*_*n39 6

一种解决方案:

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);
}
Run Code Online (Sandbox Code Playgroud)

结果 :

[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);
}
Run Code Online (Sandbox Code Playgroud)

结果 :

(7, 99, 21)