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

Dart/Flutter 如何判断数组是否包含指定子数组并获取其下标

Dart嵌套列表查找下标返回-1问题解决方案

问题根因

Dart中的List属于引用类型,默认==运算符比较的是两个列表的内存地址,而非内部元素值。你调用indexOf时传入的[1,1]是全新的列表实例,和目标数组中存储的[1,1]内存地址不同,因此会被判定为不匹配,始终返回-1。

解决方案

使用indexWhere方法自定义匹配规则即可,两种常用实现方式如下:

1. 固定长度子元素轻量实现

如果目标数组的所有子元素都是固定长度的二元数组,可以直接逐个比较元素值:

void main() {
  List<List<int>> list = [[0, 3], [0, 4], [1, 0], [1, 1], [1, 2], [1, 3]];
  List<int> target = [1, 1];
  int index = list.indexWhere((item) => item[0] == target[0] && item[1] == target[1]);
  print(index); // 输出3
}

2. 任意长度子元素通用实现

如果子元素长度不固定,Flutter项目可以直接使用foundation库提供的listEquals方法深度比较列表内容:
首先导入依赖:

import 'package:flutter/foundation.dart';

然后实现查找逻辑:

void main() {
  List<List<int>> list = [[0, 3], [0, 4], [1, 0], [1, 1], [1, 2], [1, 3]];
  List<int> target = [1, 1];
  int index = list.indexWhere((item) => listEquals(item, target));
  print(index); // 输出3
}

纯Dart项目可以自行实现列表内容比较逻辑:

bool listEquals(List<int> a, List<int> 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;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:24:04