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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:54:03