如何在dart中按值对Map进行排序?

12

我想要按值对一个 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}。

谢谢!

4个回答

18

默认的映射类按键的插入顺序排序。最简单的方法是创建一个新的映射,其中包含按照您想要的顺序添加的相同条目。

首先,让我们找到您想要的顺序:

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

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


你的代码不是完全安全的。如果地图中包含值为 null 的情况会发生什么?是的,在这种情况下,你的代码将失败。 - mezoni
正确。如所述,我假设这些值是“可比较的”,而“null”则不是。如果它们不是“可比较的”,您将不得不想出如何比较它们的方法。 - lrn

13

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

1
按降序排列 https://dev59.com/XV4c5IYBdhLWcg3wdKKT#58205412 - genericUser

1

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

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


无法将参数类型“(Pair<dynamic, dynamic>, Pair<dynamic, dynamic>) → int”分配给“Ordering”。 - awpathum

0

官方建议是在构建可迭代对象的映射时使用 '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};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接