如何按其在 dart 中的值对地图进行排序?

awp*_*hum 5 dart

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

{'201': 4, '2017CS197': 2, '2017CS300': 6, '202': 4, '205': 3, '206': 3, '207': 5}
Run Code Online (Sandbox Code Playgroud)

这是我的地图。

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

谢谢你!

lrn*_*lrn 9

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

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;
});
Run Code Online (Sandbox Code Playgroud)

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

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

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

var newMap = Map<String, int>.fromEntries(sortedEntries);
Run Code Online (Sandbox Code Playgroud)

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

map..clear()..addEntries(sortedEntries)
Run Code Online (Sandbox Code Playgroud)

或者

for (var entry in sortedEntries) {
  map..remove(entry.key)..[entry.key] = entry.value;
}
Run Code Online (Sandbox Code Playgroud)

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


Adr*_*uri 6

要在 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}
Run Code Online (Sandbox Code Playgroud)