从dart中的另一个列表中删除列表
我有两个列表,从dart中的另一个列表中删除列表,dart,Dart,我有两个列表,lst1和lst2。我想执行lst1-lst2,它返回lst1的所有元素,而不是lst2 var lst1 = ["t1" , "t2" , "t3" , "t4"]; var lst2 = ["t2" , "t4" , "t5"]; //output: ["t1" , "t3"] 转换为集合并获取差异,然后转换回列表(注意,不会保留重复项或元素顺序): 输出 [t1, t3] 使用建议的集合的方法可能是最快的,但如果您的第一个列表包含要保留的重复项,集合将完全销毁它们 相反,
lst1
和lst2
。我想执行lst1-lst2
,它返回lst1
的所有元素,而不是lst2
var lst1 = ["t1" , "t2" , "t3" , "t4"];
var lst2 = ["t2" , "t4" , "t5"];
//output: ["t1" , "t3"]
转换为集合并获取差异,然后转换回列表(注意,不会保留重复项或元素顺序): 输出
[t1, t3]
使用建议的集合的方法可能是最快的,但如果您的第一个列表包含要保留的重复项,集合将完全销毁它们 相反,您可以使用简单的列表过滤方法
void main(){
var lst1=[“t1”、“t2”、“t2”、“t3”、“t3”、“t4”];//引入重复项
变量lst2=[“t2”、“t4”、“t5”];
var set1=设置自(lst1);
var set2=从(lst2)开始设置;
打印(列表.起始(set1.差异(set2));
//输出:[t1,t3]
var filtered_lst=List.from(lst1.where(
(值)=>!lst2.contains(值));
打印(已过滤);
//输出:[t1、t3、t3]
}
如果两个列表中都有重复项,并且您确实希望减去每个项目的列表项,则可以使用删除
方法(警告:这实际上会从第一个列表中删除项目,因此您可能需要先创建副本)
void main(){
var lst1=[“t1”、“t2”、“t2”、“t3”、“t3”、“t4”];//引入重复项
变量lst2=[“t2”、“t4”、“t5”];
用于(lst2中的var元素){
lst1.移除(elem);
}
打印(lst1);
//输出:[t1、t2、t3、t3]
//只有一次出现的“t2”被删除。
}
如果您希望以非破坏性的方式执行此操作并保留顺序,您可以为此创建一个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));
}
}
void main(){
最终lst1=[“t1”、“t2”、“t3”、“t4”];
最终lst2=[“t2”、“t4”、“t5”];
最终差异=lst1.whereNotIn(lst2.toList();
打印(差异);
}
不可定义的扩展{
Iterable whereNotIn(Iterable拒绝){
最终拒绝集=拒绝.toSet();
返回其中((el)=>!rejectSet.contains(el));
}
}
在这里尝试一下:
这种方法的一些好处:
- 不会改变原始列表
- 保留原始顺序
- 也适用于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));
}
}