地图值如何排序?

use*_*694 4 dart

我有这张地图:

var temp= { 
  'A' : 3,
  'B' : 1,
  'C' : 2
};
Run Code Online (Sandbox Code Playgroud)

如何对地图的值排序(降序)。我知道,我可以使用temp.values.toList().. sort()。

但是我想在这样的键的上下文中进行排序:

var temp= { 
  'B' : 1,
  'C' : 2
  'A' : 3,
};
Run Code Online (Sandbox Code Playgroud)

Sau*_*ius 8

SplayTreeMap有一个接受映射的命名构造函数和一个用于在构建新映射时对给定映射进行排序的比较器由于 SplayTreeMap 是 Map 的后代,因此您可以轻松替换它。

import 'dart:collection';
void main() {
  var unsorted = {'A': 3, 'B': 1, 'C': 2};
  final sorted = SplayTreeMap.from(
    unsorted, (key1, key2) => unsorted[key1].compareTo(unsorted[key2]));
  print(sorted);
}
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,如果两个值相同,该解决方案会丢失信息。尝试使用: `{'A': 3, 'B': 2, 'C': 2}` 将返回 `{B: 2, A: 3}` (C 键丢失) (7认同)
  • 请不要仅发布代码作为答案,还要提供解释您的代码的作用以及它如何解决问题的问题。带解释的答案通常更有帮助,质量也更好,并且更有可能吸引点赞。 (2认同)

Gün*_*uer 7

本示例使用自定义比较功能,该功能使sort()键按值排序。然后,将键和值插入到中,LinkedHashMap因为这种映射可以保证保留顺序。基本上与/sf/answers/2074061321/相同,但针对您的用例进行了自定义。

import 'dart:collection';

void main() {
  var temp= { 
    'A' : 3,
    'B' : 1,
    'C' : 2
  };

  var sortedKeys = temp.keys.toList(growable:false)
    ..sort((k1, k2) => temp[k1].compareTo(temp[k2]));
    LinkedHashMap sortedMap = new LinkedHashMap
      .fromIterable(sortedKeys, key: (k) => k, value: (k) => temp[k]);
  print(sortedMap);
}
Run Code Online (Sandbox Code Playgroud)

DartPad尝试

  • 要反转顺序,请在“..sort(...)”中交换“k1”和“k2”。要获取前 3 个,请使用 varsortedKeys = temp.keys.toList(growable:false) ..sort((k1, k2) => temp[k2].compareTo(temp[k1])).take(3); ` LinkedHashMap.fromIterable(...)` 将仅根据这些键构建映射。 (2认同)