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

Flutter中如何判断List<List<int>>序列是另一同类型列表的子序列

Flutter 实现子序列包含判断方案

问题原因

DeepCollectionEquality.equals是全等判断方法,要求两个对比列表的长度、每个索引位置的元素都完全一致才会返回true,所以当sequenceTwo新增元素后长度大于sequence,自然返回false,你需要的是子序列/元素包含逻辑,而非全等判断。

实现方案

场景1:要求顺序一致的连续子序列匹配

即sequence的元素按原有顺序连续出现在sequenceTwo中,符合你给出的示例场景,实现代码如下:
首先确保你已引入collection依赖(Flutter 项目默认通常已包含,缺失可在pubspec.yaml中添加),然后实现工具函数:

import 'package:flutter/foundation.dart';
import 'package:collection/collection.dart';

bool isSequenceContained(List<List<int>> source, List<List<int>> target) {
  final deepEqual = const DeepCollectionEquality().equals;
  // 源序列长度大于目标序列直接返回false
  if (source.length > target.length) return false;
  // 遍历所有可能的起始匹配位置
  for (int start = 0; start <= target.length - source.length; start++) {
    bool isMatch = true;
    for (int idx = 0; idx < source.length; idx++) {
      if (!deepEqual(source[idx], target[start + idx])) {
        isMatch = false;
        break;
      }
    }
    if (isMatch) return true;
  }
  return false;
}

调用效果:

// 你原有测试代码不变
sequenceTwo.add(Uint8List.fromList([42, 6, 1, 9, 3, 60, 13, 10]));
debugPrint('是否包含子序列: ${isSequenceContained(sequence, sequenceTwo)}'); // 输出true

场景2:不要求顺序,只要所有元素存在

如果不需要匹配顺序,只要sequence的每个元素都能在sequenceTwo中找到,使用如下工具函数:

bool isAllElementsExist(List<List<int>> source, List<List<int>> target) {
  final deepEqual = const DeepCollectionEquality().equals;
  for (var srcItem in source) {
    bool found = false;
    for (var tgtItem in target) {
      if (deepEqual(srcItem, tgtItem)) {
        found = true;
        break;
      }
    }
    if (!found) return false;
  }
  return true;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:54:05