Dart中是否有可判断List元素存在于另一List的内置方法
Dart List 实现跨列表元素存在性判断方案
Dart没有提供一步完成该需求的专属List内置方法,但可以通过组合List原生内置方法轻松实现,首先需要先修正现有代码的两个基础问题:
- 你声明的列表类型是
List<Word>,但直接传入字符串字面量会触发类型错误,需要传入Word类的实例 - 自定义类默认按内存地址做相等判定,两个属性完全相同的不同实例会被判定为不相等,需要先统一相等判断规则,否则匹配结果会不符合预期。
可直接运行的实现代码
首先修正Word类,重写相等判断逻辑,只要word属性值一致就认为两个实例相等:
class Word{ String word; Word({required this.word}); @override bool operator ==(Object other) => identical(this, other) || other is Word && runtimeType == other.runtimeType && word == other.word; @override int get hashCode => word.hashCode; } void main() { List<Word> firstList = [ Word(word: "Add"), Word(word: "All"), Word(word: "Human"), Word(word: "Moon"), Word(word: "Free") ]; List<Word> secondList= [ Word(word: "Add"), Word(word: "Human"), Word(word: "Free") ]; // 遍历firstList逐个判断是否存在于secondList for (final item in firstList) { print(secondList.contains(item)); } }
运行上述代码,输出结果和预期完全一致:
true false true false true
用到的内置方法说明
- 核心用到
List.contains()方法:这是List的原生内置方法,作用是判断当前列表是否存在与传入参数相等的元素,匹配成功返回true,否则返回false。 - 如果你不想重写
Word类的相等判断逻辑,可以改用List.any()内置方法实现,直接在判断条件里比对属性值即可,不需要修改类定义:
void main() { // 省略Word类和列表定义,和之前一致 for (final item in firstList) { print(secondList.any((element) => element.word == item.word)); } }
List.any()的作用是遍历列表,检查是否存在至少一个元素满足传入的判定条件,只要有一个元素符合就返回true。
大列表场景优化
如果两个列表的数据量很大,上述两种写法每次判断都要遍历一次secondList,时间复杂度为O(n*m),性能较差。可以先把secondList的匹配维度转成Set,利用Set哈希查询O(1)的特性把整体时间复杂度降到O(n+m):
void main() { // 省略Word类和列表定义 // 先把secondList的word属性提取为Set final targetWordSet = secondList.map((e) => e.word).toSet(); for (final item in firstList) { print(targetWordSet.contains(item.word)); } }
内容的提问来源于stack exchange,提问作者erkaneroglu
相关产品推荐
相关产品推荐

