LinkedHashSet是基于哈希表的Set实现。
Set的默认实现是LinkedHashSet。
LinkedHashSet还记录了元素插入的顺序,迭代按照从先到后的插入顺序进行。
LinkedHashSet中的元素必须具有一致的Object.==和Object.hashCode实现。这意味着==运算符必须在元素上定义一个稳定的等价关系(自反的、对称的、传递的,并且随时间保持一致),而hashCode必须与通过==运算符认为相等的对象相同。
元素的迭代按插入顺序进行。较晚添加的元素将在迭代中较晚出现。添加已存在于集合中的元素不会改变其在迭代顺序中的位置,但移除元素后再添加它将使它成为迭代中的最后一个元素。
HashSet上的大多数简单操作都是在常数时间(可能摊销)内完成的:add、contains、remove和length,前提是对象的哈希码分布良好。
注意:不要在集合上的操作进行时修改集合(添加或删除元素),例如在forEach或containsAll调用期间调用的函数中,或者迭代集合时。
不要以改变它们的等价性(从而改变它们的hashCode)的方式来修改集合中的元素。某些专门的集合类型可能对等价性更宽容,在这种情况下,它们应该记录它们的不同行为和限制。
示例
final planets = <String>{}; // LinkedHashSet
final uranusAdded = planets.add('Uranus'); // true
planets.addAll({'Venus', 'Mars', 'Earth', 'Jupiter'});
print(planets); // {Uranus, Venus, Mars, Earth, Jupiter}
要检查集合是否为空,请使用isEmpty或isNotEmpty。要找到集合中的元素数量,请使用length。
print(planets.isEmpty); // false
print(planets.length); // 5
要检查集合是否包含具有特定值的元素,请使用contains。
final marsExists = planets.contains('Mars'); // true
forEach方法调用与集合中每个元素关联的函数。
planets.forEach(print);
// Uranus
// Venus
// Mars
// Earth
// Jupiter
要复制集合,请使用toSet。
final copySet = planets.toSet();
print(copySet); // {Uranus, Venus, Mars, Earth, Jupiter}
要删除元素,请使用remove。
final removedValue = planets.remove('Mars'); // Mars
print(planets); // {Uranus, Venus, Earth, Jupiter}
要同时删除多个元素,请使用removeWhere或removeAll。
planets.removeWhere((element) => element.startsWith('E'));
print(planets); // {Uranus, Venus, Jupiter}
要删除所有不满足条件的元素,请使用retainWhere。
planets.retainWhere((element) => element.contains('Jupiter'));
print(planets); // {Jupiter}
```dart continued
To remove all elements and empty the set, use [clear].
```dart continued
planets.clear();
print(planets.isEmpty); // true
print(planets); // {}
另请参阅
- Set是集合的一般接口,其中每个对象只能出现一次。
- HashSet迭代对象的顺序是不保证的。
- SplayTreeSet按排序顺序迭代对象。
- 实现类型
-
- Set<
E>
- Set<
- 可用扩展
构造函数
- LinkedHashSet({bool equals(E, E)?, int hashCode(E)?, bool isValidKey(dynamic)?})
- 使用提供的
equals
和hashCode
创建一个插入顺序的哈希集合。工厂 - LinkedHashSet.from(Iterable elements)
- 创建一个包含所有
elements
的链式哈希集合。工厂 - LinkedHashSet.identity()
- 创建一个插入顺序的基于身份的集合。工厂
-
LinkedHashSet.of(Iterable<
E> elements) - 从
elements
创建一个链式哈希集合。工厂
属性
- first → E
- 第一个元素。no setterinherited
- hashCode → int
- 此对象的哈希码。no setterinherited
- isEmpty → bool
- 此集合是否没有元素。no setterinherited
- isNotEmpty → bool
- 此集合是否至少有一个元素。no setterinherited
-
iterator → Iterator<
E> - 提供一个迭代器,按插入顺序遍历元素。no setteroverride
- last → E
- 最后一个元素。no setterinherited
- length → int
- 此 Iterable 中的元素数量。no setterinherited
- runtimeType → Type
- 对象运行时类型的表示。no setterinherited
- single → E
- 检查此可迭代是否只有一个元素,并返回该元素。no setterinherited
方法
-
add(
E value) → bool - 将
value
添加到集合中。inherited -
addAll(
Iterable< E> elements) → void - 将所有
elements
添加到这个集合中。inherited -
any(
bool test(E element)) → bool - 检查此可迭代对象中是否有任何元素满足
test
。inherited -
cast<
R> () → Set< R> - 提供此集合作为
R
实例集合的视图。inherited -
clear(
) → void - 从集合中删除所有元素。inherited
-
contains(
Object? value) → bool - 判断
value
是否在集合中。inherited -
containsAll(
Iterable< Object?> other) → bool - 判断此集合是否包含
other
的所有元素。inherited -
difference(
Set< Object?> other) → Set<E> - 创建一个新集合,包含此集合中不在
other
中的元素。inherited -
elementAt(
int index) → E - 返回第
index
个元素。inherited -
every(
bool test(E element)) → bool - 检查此可迭代对象中的每个元素是否都满足
test
。inherited -
expand<
T> (Iterable< T> toElements(E element)) → Iterable<T> - 将此 可迭代对象 的每个元素扩展为零个或多个元素。inherited
-
firstWhere(
bool test(E element), {E orElse()?}) → E - 返回满足给定谓词
test
的第一个元素。inherited -
fold<
T> (T initialValue, T combine(T previousValue, E element)) → T - 通过迭代地将集合中的每个元素与现有值结合,将集合缩减为一个单个值inherited
-
followedBy(
Iterable< E> other) → Iterable<E> - 创建当前可迭代对象与
other
的懒连接。inherited -
forEach(
void action(E element)) → void - 在集合的每个元素上执行一个函数。override
-
intersection(
Set< Object?> other) → Set<E> - 创建一个新集合,该集合是此集合与
other
的交集。inherited -
join(
[String separator = ""]) → String - 将每个元素转换为 String 并连接字符串。inherited
-
lastWhere(
bool test(E element), {E orElse()?}) → E - 满足给定谓词
test
的最后一个元素。inherited -
lookup(
Object? object) → E? - 如果集合中存在与
object
相等的对象,则返回它。inherited -
map<
T> (T toElement(E e)) → Iterable< T> - 通过
toElement
修改的当前可迭代对象的元素。inherited -
noSuchMethod(
Invocation invocation) → dynamic - 在访问不存在的方法或属性时被调用。inherited
-
reduce(
E combine(E value, E element)) → E - 通过迭代组合集合的元素,将集合减少到单个值。inherited
-
remove(
Object? value) → bool - 从集合中移除
value
。inherited -
removeAll(
Iterable< Object?> elements) → void - 从集合中移除
elements
的每个元素。inherited -
removeWhere(
bool test(E element)) → void - 移除所有满足
test
的集合元素。inherited -
retainAll(
Iterable< Object?> elements) → void - 移除此集合中不在
elements
中的所有元素。inherited -
retainWhere(
bool test(E element)) → void - 移除所有不满足
test
的集合元素。inherited -
singleWhere(
bool test(E element), {E orElse()?}) → E - 满足
test
的单个元素。inherited -
skip(
int count) → Iterable< E> - 创建一个 Iterable,提供除了前
count
个元素之外的所有元素。inherited -
skipWhile(
bool test(E value)) → Iterable< E> - 创建一个在
test
满足时跳过前面的元素的Iterable
。inherited -
take(
int count) → Iterable< E> - 创建一个惰性可迭代对象,包含此可迭代对象的前
count
个元素。inherited -
takeWhile(
bool test(E value)) → Iterable< E> - 创建一个惰性可迭代对象,包含满足
test
条件的起始元素。inherited -
toList(
{bool growable = true}) → List< E> - 创建一个包含此 可迭代对象 元素的 列表。inherited
-
toSet(
) → Set< E> - 创建一个与这个
Set
有相同元素和行为的新 集合。inherited -
toString(
) → String - 此对象的一个字符串表示。inherited
-
union(
Set< E> other) → Set<E> - 创建一个新的集合,包含此集合和
other
中的所有元素。inherited -
where(
bool test(E element)) → Iterable< E> - 创建一个新的惰性 可迭代对象,包含满足谓词
test
的所有元素。inherited -
whereType<
T> () → Iterable< T> - 创建一个新的惰性 可迭代对象,包含所有类型为
T
的元素。inherited
运算符
-
operator ==(
Object other) → bool - 相等运算符。inherited