一个可以相互比较的 Map 对象。
该映射基于自平衡的二叉树。它允许大多数单条目操作在摊销对数时间内完成。
映射的键使用在构造函数中传递的 compare
函数进行比较,包括排序和相等性。如果映射只包含键 a
,则 map.containsKey(b)
将在 compare(a, b) == 0
且 a == b
的值甚至未被检查的情况下返回 true
。如果省略比较函数,则假设对象是 Comparable,并使用它们的 Comparable.compareTo 方法进行比较。在这种情况下,不可比较的对象(包括 null
)不能作为键使用。
为了允许使用不支持 compare
函数的对象来调用 operator []、remove 或 containsKey,可以提供额外的 isValidKey
断言函数。在将比较函数应用于可能不是 K
值的参数值之前,将测试此函数。如果省略,则 isValidKey
函数默认为测试值是否是 K
。
注意:不要在操作映射(例如,在 forEach 或 putIfAbsent 调用期间调用的函数中添加或删除键)时修改映射,或在迭代映射时(keys、values 或 entries)。
示例
final planetsByMass = SplayTreeMap<double, String>((a, b) => a.compareTo(b));
要将数据添加到映射中,请使用 operator[]、addAll 或 addEntries。
planetsByMass[0.06] = 'Mercury';
planetsByMass
.addAll({0.81: 'Venus', 1.0: 'Earth', 0.11: 'Mars', 317.83: 'Jupiter'});
要检查映射是否为空,请使用 isEmpty 或 isNotEmpty。要查找映射条目的数量,请使用 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}
要条件性地添加或修改特定键的值,取决于是否已存在具有该键的条目,请使用 putIfAbsent 或 update。
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 依次按键插入顺序迭代。
- 混合类型
-
- MapMixin<
K, V>
- MapMixin<
构造函数
- 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)?])
- 创建一个包含所有
other
的键/值对的SplayTreeMap
。工厂 - 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
关联到values
的SplayTreeMap
。工厂 -
SplayTreeMap.of(Map<
K, V> other, [int compare(K key1, K key2)?, bool isValidKey(dynamic potentialKey)?]) - 创建一个包含
other
中所有键值对的 SplayTreeMap。示例工厂
属性
-
entries → Iterable<
MapEntry< K, V> > - 本映射的映射条目。无setteroverride
- hashCode → int
- 此对象的哈希码。无setterinherited
- isEmpty → bool
- 映射中是否没有键值对。无setteroverride
- isNotEmpty → bool
- 映射中是否至少有一个键值对。无setteroverride
-
keys → Iterable<
K> - 本映射的键。无setteroverride
- length → int
- 映射中的键值对数量。无setteroverride
- runtimeType → Type
- 对象的运行时类型的表示。无setterinherited
-
values → Iterable<
V> - 本映射的值。无setteroverride
方法
-
addAll(
Map< K, V> other) → void - 将
other
中的所有键值对添加到本映射中。override -
addEntries(
Iterable< MapEntry< newEntries) → voidK, V> > - 将
newEntries
中的所有键值对添加到本映射中。inherited -
cast<
RK, RV>( ) → Map< RK, RV> - 如果需要,提供此映射作为具有
RK
键和RV
实例的视图。inherited -
clear(
) → void - 删除映射中的所有条目。override
-
containsKey(
Object? key) → bool - 判断此映射是否包含给定的
key
。override -
containsValue(
Object? value) → bool - 判断此映射是否包含给定的
value
。override -
firstKey(
) → K? - 映射中的第一个键。
-
firstKeyAfter(
K key) → K? - 获取映射中大于
key
的第一个键。如果没有找到键,返回null
。 -
forEach(
void f(K key, V value)) → void - 将操作
action
应用到映射中的每个键/值对。override -
lastKey(
) → K? - 映射中的最后一个键。
-
lastKeyBefore(
K key) → K? - 映射中严格小于
key
的最后一个键。 -
map<
K2, V2> (MapEntry< K2, V2> transform(K key, V value)) → Map<K2, V2> - 返回一个新的映射,其中此映射的所有条目都通过给定的
convert
函数进行了转换。inherited -
noSuchMethod(
Invocation invocation) → dynamic - 当访问不存在的方法或属性时被调用。inherited
-
putIfAbsent(
K key, V ifAbsent()) → V - 查找
key
的值,如果不存在,则添加新条目。override -
remove(
Object? key) → V? - 如果存在,从映射中删除
key
和其相关联的值。override -
removeWhere(
bool test(K key, V value)) → void - 删除满足给定条件的所有条目。inherited
-
toString(
) → String - 该对象的一串表示。inherited
-
update(
K key, V update(V value), {V ifAbsent()?}) → V - 更新给定
key
的值。override -
updateAll(
V update(K key, V value)) → void - 更新所有值。override
操作符
-
operator ==(
Object other) → bool - 等号操作符。inherited
-
operator [](
Object? key) → V? - 给定
key
的值,如果key
不在映射中,则为null
。override -
operator []=(
K key, V value) → void - 将
key
与给定的value
相关联。override