来自文档:
Dart中的集合是唯一项的无序集合。
但是如果我运行这个示例代码:
final a = {0, 1, 2};
final b = {2, 1, 0};
for (final i in a) {
print('a - $i');
}
for (final i in b) {
print('b - $i');
}
print(a == b);
我得到了输出
a - 0
a - 1
a - 2
b - 2
b - 1
b - 0
false
两个可迭代对象a
和b
在循环时表现不一样,==
是false
(但我猜==
是有意义的,因为a
和b
不是同一个实例)。
然而,我不明白的是a
和b
是否是常量:
const a = {0, 1, 2};
const b = {2, 1, 0};
for (final i in a) {
print('a - $i');
}
for (final i in b) {
print('b - $i');
}
print(a == b);
产生相同的输出。
如果我订购b
作为a
:
const a = {0, 1, 2};
const b = {0, 1, 2};
for (final i in a) {
print('a - $i');
}
for (final i in b) {
print('b - $i');
}
print(a == b);
日志:
a - 0
a - 1
a - 2
b - 0
b - 1
b - 2
true
我有点惊讶const a = {0, 1, 2}
和const b = {2, 1, 0}
不相等。是不是const
变量被重用,是不是a
和b
应该是相等的,因为集合是无序的?
我错过了什么?
Dart集合有序,因为如果您使用它们的iterator
,您将在中获得一些顺序的元素。这个顺序可能是可预测的,也可能是不可预测的。一般来说,集合的顺序是不指定的,但一些Set
实现可能会选择指定特定的顺序。
唯一需要的是,除非集合改变,否则集合的顺序不会改变。所以,如果你把同一个集合迭代两次,中间不改变它,你会得到相同的顺序——不管它是什么。
LinkedHashSet
承诺插入排序。SplayTreeSet
承诺比较器排序- 常量集字面量承诺源排序(如果同一值多次出现,则第一次出现)。它们就像不可变的
LinkedHashSet
s。