You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 04:39:20