我有以下代码:
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 语言中可能吗?
默认Map
实现是 a LinkedHashMap
,因此它依赖于计算密钥的哈希码。有几种方法可以使密钥比较相等:
实施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)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) 归档时间: |
|
查看次数: |
346 次 |
最近记录: |