2
votes

Comment trier une carte par sa valeur en fléchettes?

Je veux trier une Map<String,int> par valeurs.

{'201': 4, '2017CS197': 2, '2017CS300': 6, '202': 4, '205': 3, '206': 3, '207': 5}

c'est ma carte.

après que je veux obtenir le résultat comme {'2017CS300': 6, '207': 5, '202': 4, '201': 4, '206': 3, '205': 3, '2017CS197': 2}

Je vous remercie!


0 commentaires

3 Réponses :


1
votes

Je suppose que vous pouvez utiliser SortedMap partir de ce package :

Contrairement à SplayTreeMap les objets peuvent être classés à la fois sur la clé et la valeur ou sur une combinaison des deux.


1 commentaires

cela donne une erreur. Le type d'argument '(Pair <dynamic, dynamic>, Pair <dynamic, dynamic>) → int' ne peut pas être affecté au type de paramètre 'Ordering'



4
votes

La classe de carte par défaut est ordonnée par insertion sur les clés. L'approche la plus simple consiste simplement à créer une nouvelle carte avec les mêmes entrées, ajoutées dans l'ordre souhaité. Tout d'abord, trouvons l'ordre que vous voulez:

for (var entry in sortedEntries) {
  map..remove(entry.key)..[entry.key] = entry.value;
}

(Cela suppose que vos clés et valeurs sont toutes Comparable , sinon vous devez trouver comment les comparer vous-même. Dans ce cas particulier, où les clés sont des String s et les valeurs sont des int s, seules null clés null ou les valeurs peuvent être incomparables. ).

Cela classe les entrées dans l'ordre inverse des valeurs et pour des valeurs égales, dans l'ordre inverse des clés.

Vous pouvez ensuite créer une nouvelle carte à partir de ces entrées:

map..clear()..addEntries(sortedEntries)

ou vous pouvez modifier la carte existante en supprimant les anciennes entrées et en ajoutant la nouvelle:

var newMap = Map<String, int>.fromEntries(sortedEntries);

ou

var sortedEntries = map.entries.toList()..sort((e1, e2) {
  var diff = e2.value.compareTo(e1.value);
  if (diff == 0) diff = e2.key.compareTo(e1.key);
  return diff;
});

Il n'y a aucune fonctionnalité sur la classe de carte elle-même pour ordonner ses entrées.


2 commentaires

Votre code n'est pas une sécurité intégrée. Que se passera-t-il si la carte contiendra la valeur avec une valeur null ? Oui. votre code, dans ce cas, échouera.


Correct. Comme indiqué, j'ai supposé que les valeurs étaient Comparable , ce qui n'est pas null . S'ils ne sont pas Comparable , vous devrez déterminer comment vous souhaitez les comparer.



1
votes

Pour trier une carte en fonction de sa valeur dans l'ordre croissant dans Dart:

Map<String, int> map = {'one': 10, 'two': 5, 'three': 7, 'four': 0};

var mapEntries = map.entries.toList()
  ..sort((a, b) => a.value.compareTo(b.value));

map
  ..clear()
  ..addEntries(mapEntries);

print(map); // Must print: {four: 0, two: 5, three: 7, one: 10}


0 commentaires