如何按飞镖中的值对地图排序?

时间:2019-05-09 17:36:22

标签: dart

我想按值对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 个答案:

答案 0 :(得分:1)

要在飞镖中按地图的升序对地图进行排序

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 :(得分:0)

我想您可以使用this package中的SortedMap

  

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

答案 2 :(得分:0)

使用软件包queries对地图进行排序:

import 'package:queries/collections.dart';

void main() {
  print(_map);
  var map = Dictionary.fromMap(_map)
      .orderByDescending((kv) => kv.value)
      .thenByDescending((kv) => kv.key)
      .toDictionary$1((kv) => kv.key, (kv) => kv.value)
      .toMap();
  print(map);
}

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

结果:

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

文件“ pubspec.yaml”:

dependencies: queries: ^0.1.12

答案 3 :(得分:0)

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

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,而值是{{ 1}} s,只有int键或值是无法比拟的。

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

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

null

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

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

map..clear()..addAll(sortedEntries)

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