【问题标题】:Dart Comparison of Objects within a listDart 列表中对象的比较
【发布时间】:2021-10-21 14:45:36
【问题描述】:

你会看到我正在尝试,当我传递给他三个对象时,他只停留在不重复的对象上,即关于以下内容:

Person p = Person("nombre", "apellido");
Person p2 = Person("nombre", "apellido");
Person p3 = Person("nombre2", "apellido2");

var list = [ p, p2, p3 ];
Set<Persona> set2 = {...list};

var i = 1;
filteredList.forEach((element) {
 print("Person " + i.toString() + ": " + element.toString());
 i++;
});

它应该返回如下内容:

Person 1: Person{nombre: nombre, apellido: apellido}
Person 3: Person{nombre: nombre2, apellido: apellido2}

现在的 Person 类是这样的:

Person 1: Person{nombre: nombre, apellido: apellido}
Person 2: Person{nombre: nombre, apellido: apellido}
Person 3: Person{nombre: nombre2, apellido: apellido2}

La clase Persona por aora esta tal que asi:

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;
  }

  @override
  String toString() {
    return 'Person{nombre: $nombre, apellido: $apellido}';
  }
}

【问题讨论】:

  • 您还需要实现Person.hashCode 属性(例如使用hashValues 顶级函数或Object.hashAll 方法)
  • 正如the answer to your earlier question 所解释的,您必须覆盖both operator == hashCodeSet 依赖于两者来识别应该被认为是唯一的对象。

标签: android ios flutter dart


【解决方案1】:

set 实现没有检测到两个应该相等的对象,那么这里发生了什么?

Set 文档为我们提供了第一条线索:

默认的Set 实现LinkedHashSet 认为如果对象在运算符Object.== 方面相等则无法区分。

== 在这里被正确实现。让我们看看LinkedHashSet 对平等有什么看法:

LinkedHashSet 的元素必须具有一致的 Object.== 和 Object.hashCode 实现。这意味着 == 运算符必须在元素上定义一个稳定的等价关系(自反、对称、传递和随时间一致),并且对于 == 认为相等的对象,hashCode 必须相同。

虽然== 在您的类中实现,但hashCode 没有。这是一个问题,因为我们可以看到,默认的 Set 实现依赖于它。

幸运的是,Dart 2.14 让您的工作变得相当轻松:

int get hashCode => Object.hash(nombre, apellidio);

【讨论】:

    猜你喜欢
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-26
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 2021-03-30
    相关资源
    最近更新 更多