Dart列表中自定义Person类对象去重失效,已重载==运算符如何解决?
问题根因
Dart中哈希集合(Set、Map的key等)判断两个对象是否相等时,需要同时满足两个条件:
- 两个对象调用
==运算符返回true - 两个对象的
hashCode属性值相等
判断逻辑会先比较hashCode,如果值不相等直接判定为不同对象,不会再调用==做校验。
你只重写了==运算符,没有重写hashCode,默认hashCode是基于对象内存地址生成的,两个属性完全相同的Person实例内存地址不同,hashCode自然不同,所以Set会将其识别为两个不同元素,无法实现去重。
另外你的测试代码存在两处笔误:类名声明为Person但Set泛型写的是Persona,遍历用的filteredList没有提前赋值为去重后的集合。
解决方案
第一步:给Person类新增hashCode重写逻辑,基于参与相等判断的nombre、apellido两个属性生成哈希值,Dart 2.14及以上版本可以直接用Object.hash方法快速生成:
class Person { String nombre; String apellido; Person(this.nombre, this.apellido); @override bool operator ==(other) { return (other is Person) && other.nombre == nombre && other.apellido == apellido; } // 新增hashCode重写 @override int get hashCode => Object.hash(nombre, apellido); @override String toString() { return 'Person{nombre: $nombre, apellido: $apellido}'; } }
第二步:修正测试代码的笔误:
Person p = Person("nombre", "apellido"); Person p2 = Person("nombre", "apellido"); Person p3 = Person("nombre2", "apellido2"); var list = [p, p2, p3]; Set<Person> set2 = {...list}; // 生成过滤后的列表 var filteredList = set2.toList(); var i = 1; filteredList.forEach((element) { print("Person ${i}: ${element}"); i++; });
修改后运行即可输出你预期的两条不重复的结果。
内容的提问来源于stack exchange,提问作者ZabieruSama ZabieruSama
相关产品推荐
相关产品推荐

