使用列表作为地图中的键

时间:2014-09-22 08:12:36

标签: dart

print({[1,2]:3}[[1,2]])打印null。这显然是意料之外的。

是否有一个有福的解决方法或者我是否必须创建一个新的类列表/包装器并为其提供正确的operator==hashCode

2 个答案:

答案 0 :(得分:5)

Dart中的列表没有基于其元素的相等性。

您可以将Map与自定义相等功能一起使用。 在package:collection/equality.dart中定义的列表上存在相等性,因此您可以执行以下操作:

import "package:collection/equality.dart";
main() {
  const eq = const ListEquality();
  var map = new Map(equals: eq.equals, hashCode: eq.hash, isValidKey: eq.isValidKey);
  map[[1,2]] = 42;
  print(map[[1,2]]);
}

但仍然不允许你使用地图文字。

答案 1 :(得分:1)

这是一个未解决的问题:http://dartbug.com/17963,也许http://dartbug.com/2217

Hashmap有一个构造函数,它接受计算相等性的函数和hashCode:

HashMap({
    Function bool equals(K key1, K key2), 
    Function int hashCode(K key), 
    Function bool isValidKey(potentialKey)})

您应该知道,当您根据列表中包含的元素计算hashCode并在地图中包含该列表时修改该列表时,您将无法再找到它(如您的示例中所示)