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

Moh*_*ari 4 dart

我有两个列表,lst1lst2. 我想执行lst1 - lst2,它返回lst1not in 的所有元素lst2

var lst1 = ["t1" , "t2" , "t3" , "t4"];
var lst2 = ["t2" , "t4" , "t5"];
//output: ["t1" , "t3"]
Run Code Online (Sandbox Code Playgroud)

小智 8

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

如果两个列表中都有重复项,并且您实际上想要减去每个项目的列表项,则可以使用该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.
}

Run Code Online (Sandbox Code Playgroud)


Ray*_*oal 6

Convert to sets and take the difference, then convert back to a list (with the caveat that neither duplicates nor the ordering of elements will be preserved):

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

Output

[t1, t3]
Run Code Online (Sandbox Code Playgroud)

Try it online