我对Dart中的Set数据类型感到困惑。根据文档,集合是无序的,这意味着将项目添加到集合的顺序不被保留。但是,我注意到Dart中的Sets有一个.first属性和一个.last属性。如果集合是无序的,这怎么可能呢?有人能解释一下为什么这些属性存在以及如何有效地使用它们吗?
Dart
xa9qqrwz1#
Dart在其标准库中提供了三种Set实现:HashSet、LinkedHashSet(默认值)和SplayTreeSet。这三个都实现了Set接口,这意味着它们必须都实现Iterable。SplayTreeSet和LinkedHashSet都有指定的迭代顺序。HashSet没有,但仍然实现Iterable。HashSet的API documentation对这个问题有如下的说明:集合的迭代顺序没有指定,并且取决于所提供的元素的散列码。但是,秩序是稳定的:在同一集合上的多次迭代产生相同的顺序,只要该集合不被修改。因此,尽管依赖HashSet中项目的顺序通常不是很有用,但只要不修改,你就可以。一般来说,虽然一些Set实现不是有序的,但它们是Iterable是有意义的,这样它们可以与其他非有序的Iterable API一起使用,例如for循环或Iterable.any。你可以用Iterable做很多事情,这些事情与元素的顺序无关。
Set
HashSet
LinkedHashSet
SplayTreeSet
Iterable
Iterable.any
1条答案
按热度按时间xa9qqrwz1#
Dart在其标准库中提供了三种
Set
实现:HashSet
、LinkedHashSet
(默认值)和SplayTreeSet
。这三个都实现了Set
接口,这意味着它们必须都实现Iterable
。SplayTreeSet
和LinkedHashSet
都有指定的迭代顺序。HashSet
没有,但仍然实现Iterable
。HashSet
的API documentation对这个问题有如下的说明:集合的迭代顺序没有指定,并且取决于所提供的元素的散列码。但是,秩序是稳定的:在同一集合上的多次迭代产生相同的顺序,只要该集合不被修改。
因此,尽管依赖
HashSet
中项目的顺序通常不是很有用,但只要不修改,你就可以。一般来说,虽然一些
Set
实现不是有序的,但它们是Iterable
是有意义的,这样它们可以与其他非有序的Iterable
API一起使用,例如for循环或Iterable.any
。你可以用Iterable
做很多事情,这些事情与元素的顺序无关。