如何在飞镖中按其值对地图进行排序?

  • 本文关键字:地图 排序 飞镖 dart
  • 更新时间 :
  • 英文 :


我想按值对Map<String,int>进行排序。

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

这是我的地图。

在我想得到结果为 {'2017CS300': 6,'207':5,'202':4,'201':4,'206':3,'205':3,'2017CS197':2}

谢谢!

默认映射类在键上按插入顺序排列。 最简单的方法是创建一个具有相同条目的新地图,并按所需顺序添加。 首先,让我们找到您想要的顺序:

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;
});

(这假设您的键和值都是Comparable的,否则您需要自己弄清楚如何比较它们。在这种特殊情况下,键是Strings 而值是ints,则只有null键或值可能无可比拟)。

这将按相反的值顺序对条目进行排序,对于相等的值,则按相反的键顺序对条目进行排序。

然后,您可以从这些条目创建新地图:

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

或者,您可以通过删除旧条目并添加新条目来修改现有地图:

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

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

地图类本身没有对其条目进行排序的功能。

要在 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}

我想你可以使用这个包中的SortedMap

SplayTreeMap不同,对象可以按键和值或两者的组合进行排序。

官方建议是在从可迭代对象构建地图时使用"for"元素:

var temp = {'201': 4, '2017CS197': 2, '2017CS300': 6, '202': 4, '205': 3, '206': 3, '207': 5};  
final sortedInReverse = temp.entries.toList()..sort((a, b)=> b.value.compareTo(a.value));
temp = {for (var entry in sortedInReverse) entry.key: entry.value};

最新更新