SplayTreeMap<K, V>final

一个可以按顺序相互比较的对象的 Map

该映射基于自平衡的二叉树。它允许大多数单个条目操作在摊销对数时间内完成。

映射的键使用在构造函数中传入的 compare 函数进行比较,用于排序和相等性。如果映射只包含键 a,那么当 compare(a, b) == 0 时,map.containsKey(b) 将返回 true,并且不会检查 a == b 的值。如果省略比较函数,则假设对象是 Comparable,并使用它们的 Comparable.compareTo 方法进行比较。在这种情况下,不可比较的对象(包括 null)不能作为键。

为了允许使用不支持 compare 函数的对象调用 operator []removecontainsKey,可以提供一个额外的 isValidKey 断言函数。此函数在 compare 函数用于可能不是 K 值的参数值之前进行测试。如果省略,则 isValidKey 函数默认为测试值是否为 K

注意:在执行操作(例如在 forEachputIfAbsent 调用期间调用的函数中)时,不要修改映射(添加或删除键),或在对映射进行迭代时(keysvaluesentries)。

示例

final planetsByMass = SplayTreeMap<double, String>((a, b) => a.compareTo(b));

要将数据添加到映射中,请使用 operator[]addAlladdEntries

planetsByMass[0.06] = 'Mercury';
planetsByMass
    .addAll({0.81: 'Venus', 1.0: 'Earth', 0.11: 'Mars', 317.83: 'Jupiter'});

要检查映射是否为空,请使用 isEmptyisNotEmpty。要查找映射条目的数量,请使用 length

print(planetsByMass.isEmpty); // false
print(planetsByMass.length); // 5

forEach 方法会为映射的每个键/值条目调用一个函数。

planetsByMass.forEach((key, value) {
  print('$key \t $value');
  // 0.06    Mercury
  // 0.11    Mars
  // 0.81    Venus
  // 1.0     Earth
  // 317.83  Jupiter
});

要检查映射是否具有具有特定键的条目,请使用 containsKey

final keyOneExists = planetsByMass.containsKey(1.0); // true
final keyFiveExists = planetsByMass.containsKey(5); // false

要检查映射是否具有具有特定值的条目,请使用 containsValue

final earthExists = planetsByMass.containsValue('Earth'); // true
final plutoExists = planetsByMass.containsValue('Pluto'); // false

要删除具有特定键的条目,请使用 remove

final removedValue = planetsByMass.remove(1.0);
print(removedValue); // Earth

要同时删除多个条目,基于它们的键和值,请使用 removeWhere

planetsByMass.removeWhere((key, value) => key <= 1);
print(planetsByMass); // {317.83: Jupiter}

要基于是否存在具有该键的条目,有条件地添加或修改特定键的值,请使用 putIfAbsentupdate

planetsByMass.update(1, (v) => '', ifAbsent: () => 'Earth');
planetsByMass.putIfAbsent(317.83, () => 'Another Jupiter');
print(planetsByMass); // {1.0: Earth, 317.83: Jupiter}

要基于现有的键和值更新所有键的值,请使用 updateAll

planetsByMass.updateAll((key, value) => 'X');
print(planetsByMass); // {1.0: X, 317.83: X}

要删除所有条目并清空映射,请使用 clear

planetsByMass.clear();
print(planetsByMass.isEmpty); // false
print(planetsByMass); // {}

另请参阅

  • Map,键/值对集合的一般接口。
  • HashMap 是无序的(迭代顺序没有保证)。
  • LinkedHashMap 按键插入顺序迭代。
混合类型

构造函数

SplayTreeMap([int compare(K key1, K key2)?, bool isValidKey(dynamic potentialKey)?])
SplayTreeMap.from(Map other, [int compare(K key1, K key2)?, bool isValidKey(dynamic potentialKey)?])
创建一个包含所有键值对 otherSplayTreeMap
工厂
SplayTreeMap.fromIterable(Iterable iterable, {K key(dynamic element)?, V value(dynamic element)?, int compare(K key1, K key2)?, bool isValidKey(dynamic potentialKey)?})
创建一个从 iterable 计算键和值的 SplayTreeMap
工厂
SplayTreeMap.fromIterables(Iterable<K> keys, Iterable<V> values, [int compare(K key1, K key2)?, bool isValidKey(dynamic potentialKey)?])
创建一个将给定的 keys 关联到 valuesSplayTreeMap
工厂
SplayTreeMap.of(Map<K, V> other, [int compare(K key1, K key2)?, bool isValidKey(dynamic potentialKey)?])
创建一个包含 other 中所有键值对的 SplayTreeMap。示例
工厂

属性

entries Iterable<MapEntry<K, V>>
Map 的映射条目。
无设置器覆盖
hashCode int
此对象的哈希码。
无设置器继承
isEmpty bool
映射中是否没有键值对。
无设置器覆盖
isNotEmpty bool
映射中是否至少有一个键值对。
无设置器覆盖
keys Iterable<K>
Map 的键。
无设置器覆盖
length int
映射中键值对的数量。
无设置器覆盖
runtimeType Type
对象运行时类型的表示。
无设置器继承
values Iterable<V>
Map 的值。
无设置器覆盖

方法

addAll(Map<K, V> other) → void
other 中的所有键值对添加到此映射中。
覆盖
addEntries(Iterable<MapEntry<K, V>> newEntries) → void
newEntries 中的所有键值对添加到此映射中。
继承
cast<RK, RV>() Map<RK, RV>
在需要时,提供此映射的视图,具有 RK 键和 RV 实例。
继承
clear() → void
从映射中移除所有条目。
覆盖
containsKey(Object? key) bool
此映射是否包含给定的 key
覆盖
containsValue(Object? value) bool
此映射是否包含给定的 value
覆盖
firstKey() → K?
映射中的第一个键。
firstKeyAfter(K key) → K?
获取映射中严格大于 key 的第一个键。如果未找到此类键,则返回 null
forEach(void f(K key, V value)) → void
action 应用到映射中的每个键/值对。
覆盖
lastKey() → K?
映射中的最后一个键。
lastKeyBefore(K key) → K?
映射中严格小于 key 的最后一个键。
map<K2, V2>(MapEntry<K2, V2> transform(K key, V value)) Map<K2, V2>
返回一个新映射,其中此映射的所有条目都通过给定的 convert 函数转换。
继承
noSuchMethod(Invocation invocation) → dynamic
当访问不存在的方法或属性时调用。
继承
putIfAbsent(K key, V ifAbsent()) → V
查找 key 的值,如果不存在则添加新条目。
覆盖
remove(Object? key) → V?
如果存在,从映射中移除 key 及其关联的值。
覆盖
removeWhere(bool test(K key, V value)) → void
移除所有满足给定 test 的此映射中的条目。
继承
toString() String
此对象的字符串表示形式。
继承
update(K key, V update(V value), {V ifAbsent()?}) → V
更新提供的 key 的值。
覆盖
updateAll(V update(K key, V value)) → void
更新所有值。
覆盖

运算符

operator ==(Object other) bool
等号运算符。
继承
operator [](Object? key) → V?
给定 key 的值,如果 key 不在此映射中,则返回 null
覆盖
operator []=(K key, V value) → void
key 与给定的 value 关联。
覆盖