我有两个列表,lst1
和lst2
。我要执行lst1 - lst2
,它返回lst1
中所有lst2
的元素。
var lst1 = ["t1" , "t2" , "t3" , "t4"];
var lst2 = ["t2" , "t4" , "t5"];
//output: ["t1" , "t3"]
答案 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]
答案 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
这种方法的一些好处: