更改检查映射键是否相等的方式

use*_*104 3 dart

我有以下代码:

class KeyClass {
  int property;

  KeyClass(this.property);
}

void main() {
  KeyClass kc1 = KeyClass(1);
  KeyClass kc2 = KeyClass(2);

  Map<KeyClass, String> map = Map();
  map[kc1] = 'hello';
  map[kc2] = 'world';
  ...
}
Run Code Online (Sandbox Code Playgroud)

我的目标是让以下两行从 my 中获得相同的值map

print(map[kc1]);          // prints 'hello'
print(map[KeyClass(1)]);  // prints 'null', should print 'hello' too!
Run Code Online (Sandbox Code Playgroud)

这在 Dart 语言中可能吗?

jam*_*lin 5

默认Map实现是 a LinkedHashMap,因此它依赖于计算密钥的哈希码。有几种方法可以使密钥比较相等:

  1. 实施KeyClass.operator ==KeyCode.hashCode

    class KeyClass {
      int property;
    
      KeyClass(this.property);
    
      bool operator ==(dynamic other) {
        return runtimeType == other.runtimeType && property == other.property;
      }
    
      int get hashCode => property.hashCode;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. LinkedHashMap直接使用。LinkedHashMap的构造函数允许提供自定义回调来计算相等性和哈希码:

    bool keyEquals(KeyClass k1, KeyClass k2) => k1.property == k2.property;
    int keyHashCode(KeyClass k) => k.property.hashCode;
    
    Map<KeyClass, String> map = LinkedHashMap<KeyClass, String>(
      equals: keyEquals,
      hashCode: keyHashCode,
    );
    
    Run Code Online (Sandbox Code Playgroud)