我想要按值对一个 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}。
谢谢!
我想要按值对一个 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;
});
假设您的keys和values都是Comparable
,否则您需要自己想出如何进行比较。在这种特定情况下,键是String
,值是int
,只有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的方法:
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};
null
的情况会发生什么?是的,在这种情况下,你的代码将失败。 - mezoni