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

Dart多维列表中搜索子列表失效原因及解决方法

为什么Dart多维列表使用contains搜索子列表无效?如何正确搜索?

问题原因

Dart中List属于引用类型,List.contains()方法默认通过==运算符判断元素是否存在。对于引用类型,==比较的是对象的内存引用是否相同,而非内容是否一致。

你代码里的a.contains([3, 2])中,[3,2]是新创建的List对象,和原多维列表a里的[3,2]是两个不同的实例,内存引用不同,因此contains返回false。

而一维列表中搜索基本类型(比如int)时,==比较的是值本身,所以b.contains(3)能正确返回true。

解决方案

方法1:使用any()结合listEquals(推荐)

Dart的dart:collection库提供了listEquals方法,可直接比较两个List的内容是否完全一致。结合List.any()遍历多维列表,判断是否存在匹配的子列表:

import 'dart:collection';
import 'dart:developer';

void main() {
  List a = [
    [3, 2],
    [8, 5]
  ];
  
  var target = [3, 2];
  var isContains = a.any((sublist) => listEquals(sublist, target));
  log('isContains: $isContains'); // 输出 true
}

方法2:手动遍历比较子列表内容

如果不想引入额外库,可以自行实现子列表内容的比较逻辑:

import 'dart:developer';

bool listsAreEqual(List a, List b) {
  if (a.length != b.length) return false;
  for (int i = 0; i < a.length; i++) {
    if (a[i] != b[i]) return false;
  }
  return true;
}

void main() {
  List a = [
    [3, 2],
    [8, 5]
  ];
  
  var target = [3, 2];
  var isContains = a.any((sublist) => listsAreEqual(sublist, target));
  log('isContains: $isContains'); // 输出 true
}

方法3:重写子列表的==运算符(不推荐)

若场景中需要频繁比较特定List对象,可自定义List子类并重写==和hashCode,但这种方式侵入性强,一般不推荐:

import 'dart:developer';

class ContentEqualList<T> extends ListBase<T> {
  final List<T> _list;

  ContentEqualList(this._list);

  @override
  int get length => _list.length;

  @override
  set length(int newLength) => _list.length = newLength;

  @override
  T operator [](int index) => _list[index];

  @override
  void operator []=(int index, T value) => _list[index] = value;

  @override
  bool operator ==(Object other) {
    if (identical(this, other)) return true;
    if (other is! ContentEqualList) return false;
    if (length != other.length) return false;
    for (int i = 0; i < length; i++) {
      if (this[i] != other[i]) return false;
    }
    return true;
  }

  @override
  int get hashCode => Object.hashAll(_list);
}

void main() {
  List a = [
    ContentEqualList([3, 2]),
    ContentEqualList([8, 5])
  ];
  
  var target = ContentEqualList([3, 2]);
  var isContains = a.contains(target);
  log('isContains: $isContains'); // 输出 true
}

内容的提问来源于stack exchange,提问作者jmdlb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:45:42