我想按值对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
的,否则您需要自己弄清楚如何比较它们。在这种特殊情况下,键是String
s 而值是int
s,则只有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};