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

