Dart Set<E> 如何比较项目?
How does Dart Set<E> compare items?
我只是在 Dart 中将一堆 MyClass
塞进了 Set
中。 MyClass
没有实现 Comparable
,也没有定义 ==
运算符。它编译得很好。
为了 Set
正确检测重复项,我是否必须实现 Comparable
接口,或者只是重写 ==
运算符?
所有 Dart classes 派生自 Object
,它确实提供了 operator ==
和 hashCode
。 Object
的默认实现检查对象 身份 ;您的 class 的一个实例将只与它自己进行比较。
如果您希望两个不同的实例能够比较相等,那么您需要:
- 在您的自定义 class 中实施
operator ==
和 hashCode
。 Set
的默认实现是 LinkedHashSet
,它不使用 Comparable
。 (有一个 SplayTreeSet
implementation 确实使用了 Comparable
,但是查找和插入的时间复杂度为 O(log n) 而不是 O(1)。)
- 或者使用
LinkedHashSet
constructor or the HashSet
constructor 并传递适当的回调以计算相等性和哈希码。
我只是在 Dart 中将一堆 MyClass
塞进了 Set
中。 MyClass
没有实现 Comparable
,也没有定义 ==
运算符。它编译得很好。
为了 Set
正确检测重复项,我是否必须实现 Comparable
接口,或者只是重写 ==
运算符?
所有 Dart classes 派生自 Object
,它确实提供了 operator ==
和 hashCode
。 Object
的默认实现检查对象 身份 ;您的 class 的一个实例将只与它自己进行比较。
如果您希望两个不同的实例能够比较相等,那么您需要:
- 在您的自定义 class 中实施
operator ==
和hashCode
。Set
的默认实现是LinkedHashSet
,它不使用Comparable
。 (有一个SplayTreeSet
implementation 确实使用了Comparable
,但是查找和插入的时间复杂度为 O(log n) 而不是 O(1)。) - 或者使用
LinkedHashSet
constructor or theHashSet
constructor 并传递适当的回调以计算相等性和哈希码。