Перебор SplayTreeMap не дает значений с повторяющимися ключами

У меня есть 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, чтобы иметь карту, отсортированную на основе ее ключей

Алгоритм сортировки слиянием (с кодом на Python, Java, JavaScript, PHP, C++)
Алгоритм сортировки слиянием (с кодом на Python, Java, JavaScript, PHP, C++)
Merge sort - самый популярный алгоритм сортировки, основанный на принципе алгоритма "разделяй и властвуй".
Сортировка hashmap по значениям
Сортировка hashmap по значениям
На Leetcode я решал задачу с хэшмапой и подумал, что мне нужно отсортировать хэшмапу по значениям.
0
0
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

SplayTreeMap — это тип Map, и Maps не может иметь повторяющихся ключей:

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>, если хотите, чтобы игроки были отсортированы на каждом уровне.

большое спасибо, это было очень хорошо задокументировано

arrmani88 21.03.2022 13:39

Другие вопросы по теме