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
相关产品推荐
相关产品推荐

