我有一些SplayTreeMap球員的水平,我想根據他們的水平列印這些球員的排名。
當我.forEach用來迭代 thisSplayTreeMap時,它會忽略具有相同級別的玩家(意味著在回圈時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, 擁有一個根據其鍵排序的地圖
uj5u.com熱心網友回復:
ASplayTreeMap是 的型別Map,并且Maps 不能有重復的鍵:
映射中有有限數量的鍵,每個鍵都有一個與之關聯的值。
(有Map類似的類,例如package:quiver's Multimap,但它們不能派生自,Map因為它們必須為某些方法(例如operator [])提供不同的簽名。)
如果您想要一個SplayTreeMap鍵具有多個值,那么您應該將Lists 存盤為值。例如:
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
請注意,上述實作允許每個級別內的重復玩家。如果您不想這樣,您可以使用 aSet<String>代替 a List<String>,或者SplayTreeSet<String>如果您希望玩家在每個級別內進行排序,您可以使用 a 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/447801.html
下一篇:如何在字典中選擇多個最小值?
