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

jqjz2hbq  于 2023-04-03  发布在  其他
关注(0)|答案(4)|浏览(258)

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

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

这是Map。
在我想要得到结果为'2017 CS300'之后:2017CS197:2}
谢谢你!

mepcadol

mepcadol1#

默认的map类在键上是按插入顺序的。最简单的方法是用相同的条目创建一个新的map,按照你想要的顺序添加。首先,让我们找到你想要的顺序:

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

(This假设你的键和值都是Comparable,否则你需要自己弄清楚如何比较它们。在这个特定的例子中,键是String s,值是int s,只有null键或值可能是不可比的)。
这将以相反的值顺序对条目进行排序,对于相等的值,则以相反的键顺序进行排序。
然后,您可以从这些条目创建新Map:

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

也可以通过删除旧条目并添加新条目来修改现有Map:

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

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

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

afdcj2ne

afdcj2ne2#

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

gudnpqoy3#

我想你可以从this package中使用SortedMap
SplayTreeMap不同,对象可以按键和值或两者的组合进行排序。

xmakbtuz

xmakbtuz4#

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

相关问题