У меня есть 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
, чтобы иметь карту, отсортированную на основе ее ключей
SplayTreeMap
— это тип Map
, и Map
s не может иметь повторяющихся ключей:
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>
, если хотите, чтобы игроки были отсортированы на каждом уровне.
большое спасибо, это было очень хорошо задокументировано