Dart -集合真的是无序的吗?



来自文档:

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

两个可迭代对象ab在循环时表现不一样,==false(但我猜==是有意义的,因为ab不是同一个实例)。


然而,我不明白的是ab是否是常量:

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变量被重用,是不是ab应该是相等的,因为集合是无序的?

我错过了什么?

Dart集合有序,因为如果您使用它们的iterator,您将在中获得一些顺序的元素。这个顺序可能是可预测的,也可能是不可预测的。一般来说,集合的顺序是不指定的,但一些Set实现可能会选择指定特定的顺序。

唯一需要的是,除非集合改变,否则集合的顺序不会改变。所以,如果你把同一个集合迭代两次,中间不改变它,你会得到相同的顺序——不管它是什么。

  • LinkedHashSet承诺插入排序。
  • SplayTreeSet承诺比较器排序
  • 常量集字面量承诺源排序(如果同一值多次出现,则第一次出现)。它们就像不可变的LinkedHashSets。

最新更新