遍历 SplayTreeMap 不会给出具有重复键的值
Looping over a SplayTreeMap doesn't give values with duplicated keys
我有 SplayTreeMap
个玩家及其等级,我想根据他们的等级打印这些玩家的排名。
当我使用.forEach
遍历这个SplayTreeMap
时,它忽略了具有相同等级的玩家(意味着在遍历SplayTreeMap
时,它没有考虑具有重复键的值)。
这是我的代码:
SplayTreeMap<int, String> map = SplayTreeMap<int, String>();
map[5] = 'player1';
map[2] = 'player2';
map[6] = 'player3';
map[7] = 'player4';
map[7] = 'player5';
map[7] = 'player6';
map.forEach((level, player) {
print('$player -> $level');
});
下面是这段代码的输出:
player2 -> 2
player1 -> 5
player3 -> 6
player6 -> 7
所以我问自己为什么它不打印 player4
和 player5
。
如果没有解决方案,SplayTreeMap
的最佳替代方案是什么?地图根据其键进行排序
A SplayTreeMap
is a type of Map
和 Map
不能有重复键:
There is a finite number of keys in the map, and each key has exactly one value associated with it.
(有类似 Map
的 类,例如 package:quiver
的 Multimap
,但它们不能派生自 Map
,因为它们必须提供某些方法的不同签名(例如 operator []
)。)
如果您希望 SplayTreeMap
具有单个键的多个值,那么您应该将 List
存储为值。例如:
import 'dart:collection';
extension SplayTreeMultiMapExtension<K, V> on SplayTreeMap<K, List<V>> {
void add(K key, V value) {
(this[key] ??= []).add(value);
}
}
void main() {
var map = SplayTreeMap<int, List<String>>();
map.add(5, 'player1');
map.add(2, 'player2');
map.add(6, 'player3');
map.add(7, 'player4');
map.add(7, 'player5');
map.add(7, 'player6');
map.forEach((level, players) {
for (var player in players) {
print('$player -> $level');
}
});
}
打印:
player2 -> 2
player1 -> 5
player3 -> 6
player4 -> 7
player5 -> 7
player6 -> 7
请注意,上述实施允许每个关卡中的重复玩家。如果你不想这样,你可以使用 Set<String>
而不是 List<String>
,或者你可以使用 SplayTreeSet<String>
如果你想在每个级别中对玩家进行排序。
我有 SplayTreeMap
个玩家及其等级,我想根据他们的等级打印这些玩家的排名。
当我使用.forEach
遍历这个SplayTreeMap
时,它忽略了具有相同等级的玩家(意味着在遍历SplayTreeMap
时,它没有考虑具有重复键的值)。
这是我的代码:
SplayTreeMap<int, String> map = SplayTreeMap<int, String>();
map[5] = 'player1';
map[2] = 'player2';
map[6] = 'player3';
map[7] = 'player4';
map[7] = 'player5';
map[7] = 'player6';
map.forEach((level, player) {
print('$player -> $level');
});
下面是这段代码的输出:
player2 -> 2
player1 -> 5
player3 -> 6
player6 -> 7
所以我问自己为什么它不打印 player4
和 player5
。
如果没有解决方案,SplayTreeMap
的最佳替代方案是什么?地图根据其键进行排序
A SplayTreeMap
is a type of Map
和 Map
不能有重复键:
There is a finite number of keys in the map, and each key has exactly one value associated with it.
(有类似 Map
的 类,例如 package:quiver
的 Multimap
,但它们不能派生自 Map
,因为它们必须提供某些方法的不同签名(例如 operator []
)。)
如果您希望 SplayTreeMap
具有单个键的多个值,那么您应该将 List
存储为值。例如:
import 'dart:collection';
extension SplayTreeMultiMapExtension<K, V> on SplayTreeMap<K, List<V>> {
void add(K key, V value) {
(this[key] ??= []).add(value);
}
}
void main() {
var map = SplayTreeMap<int, List<String>>();
map.add(5, 'player1');
map.add(2, 'player2');
map.add(6, 'player3');
map.add(7, 'player4');
map.add(7, 'player5');
map.add(7, 'player6');
map.forEach((level, players) {
for (var player in players) {
print('$player -> $level');
}
});
}
打印:
player2 -> 2
player1 -> 5
player3 -> 6
player4 -> 7
player5 -> 7
player6 -> 7
请注意,上述实施允许每个关卡中的重复玩家。如果你不想这样,你可以使用 Set<String>
而不是 List<String>
,或者你可以使用 SplayTreeSet<String>
如果你想在每个级别中对玩家进行排序。