从dart中的另一个列表中删除列表

时间:2019-12-20 10:01:03

标签: dart

我有两个列表,lst1lst2。我要执行lst1 - lst2,它返回lst1中所有lst2的元素。

var lst1 = ["t1" , "t2" , "t3" , "t4"];
var lst2 = ["t2" , "t4" , "t5"];
//output: ["t1" , "t3"]

4 个答案:

答案 0 :(得分:3)

使用Ray Toal建议的集合的方法可能是最快的,但是如果您的第一个列表包含要保留的重复项,则集合将完全销毁它们。

相反,您可以使用简单的列表过滤方法。

void main() {
  var lst1 = ["t1" , "t2" , "t2", "t3" , "t3", "t4"];  // introduce duplicates
  var lst2 = ["t2" , "t4" , "t5"];

  var set1 = Set.from(lst1);
  var set2 = Set.from(lst2);
  print(List.from(set1.difference(set2)));
  // Output : [t1, t3]

  var filtered_lst = List.from(lst1.where(
    (value) => !lst2.contains(value)));
  print(filtered_lst);
  // Output: [t1, t3, t3]
}

如果两个列表中都有重复项,而您实际上想减去每个项目的列表项,则可以使用remove方法(警告:这实际上将从第一个列表中删除项目,因此您可能需要先创建一个副本。)

void main() {
  var lst1 = ["t1" , "t2" , "t2", "t3" , "t3", "t4"];  // introduce duplicates
  var lst2 = ["t2" , "t4" , "t5"];

  for (var elem in lst2) {
    lst1.remove(elem);
  }
  print(lst1);
  // Output : [t1, t2, t3, t3]
  // only one occurrence of "t2" was removed.
}

答案 1 :(得分:2)

转换为集合并求和,然后转换回列表

void main() {
  var lst1 = ["t1" , "t2" , "t3" , "t4"];
  var lst2 = ["t2" , "t4" , "t5"];
  var set1 = Set.from(lst1);
  var set2 = Set.from(lst2);
  print(List.from(set1.difference(set2)));
}

输出

[t1, t3]

Try it online

答案 2 :(得分:2)

使用静态扩展方法的解决方案:

import 'package:enumerable/enumerable.dart';

void main() {
  final query = lst1.except(lst2);
  print(query.toList());
}

var lst1 = ["t1", "t2", "t3", "t4"];
var lst2 = ["t2", "t4", "t5"];

结果:

[t1, t3]

答案 3 :(得分:0)

如果您想以非破坏性的方式执行此操作并保留顺序,您可以为此创建一个 Iterable 扩展。

void main() {
  final lst1 = ["t1" , "t2" , "t3" , "t4"];
  final lst2 = ["t2" , "t4" , "t5"];
  final diff = lst1.whereNotIn(lst2).toList();
  print(diff);
}

extension WhereNotInExt<T> on Iterable<T> {
  Iterable<T> whereNotIn(Iterable<T> reject) {
    final rejectSet = reject.toSet();
    return where((el) => !rejectSet.contains(el));
  }
}

在这里试试:https://dartpad.dev/88c5c949b6ac8c2d0812e15ce10e40ce?null_safety=true

这种方法的一些好处:

  • 不会改变原始列表
  • 保留原始顺序
  • 也适用于 Iterable
  • 它使用一个集合来跟踪要拒绝的元素,因此如果两个列表都很大,它不会减慢很多