遍历 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

所以我问自己为什么它不打印 player4player5

如果没有解决方案,SplayTreeMap 的最佳替代方案是什么?地图根据其键进行排序

A SplayTreeMap is a type of MapMap 不能有重复键:

There is a finite number of keys in the map, and each key has exactly one value associated with it.

(有类似 Map 的 类,例如 package:quiverMultimap,但它们不能派生自 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> 如果你想在每个级别中对玩家进行排序。