Dart:按频率对字符串列表进行排序

时间:2020-03-23 12:08:33

标签: flutter dart

我正在尝试按频率对列表进行排序。

List myList = ["a", "b", "c", "d", "e", "f", "d", "d", "e"];

我的预期输出是该列表按频率排序并且没有重复的元素。

(myList具有3个“ d”和2个“ e”)。

List output = ["d", "e", "a", "b", "c", "f"];

最有效的方法是什么?

谢谢!


是否也可以使用“地图/对象列表”来做同一系统?

List myList2 = [{"letter": a, "info": myInfo}, {"letter": b, "info": myInfo}, ...]

1 个答案:

答案 0 :(得分:2)

即使不使用package:collection也不难。

List myList = ['a', 'b', 'c', 'd', 'e', 'f', 'd', 'd', 'e'];

// Put the number of letters in a map where the letters are the keys.
final map = <String, int>{};
for (final letter in myList) {
  map[letter] = map.containsKey(letter) ? map[letter] + 1 : 1;
}

// Sort the list of the map keys by the map values.
final output = map.keys.toList(growable: false);
output.sort((k1, k2) => map[k2].compareTo(map[k1]));

print(output);  // [d, e, a, b, c, f]

对于第二个,您所需的输出尚不清楚,但是假设与键letter对应的值是String,并且您需要与第一个完全相同的输出,您可以通过非常相似的方式来实现它。

List myList2 = [
  {'letter': 'a', 'info': 'myInfo'},
  {'letter': 'b', 'info': 'myInfo'},
  {'letter': 'c', 'info': 'myInfo'},
  {'letter': 'd', 'info': 'myInfo'},
  {'letter': 'e', 'info': 'myInfo'},
  {'letter': 'f', 'info': 'myInfo'},
  {'letter': 'd', 'info': 'myInfo'},
  {'letter': 'd', 'info': 'myInfo'},
  {'letter': 'e', 'info': 'myInfo'},
];

final map2 = <String, int>{};
for (final m in myList2) {
  final letter = m['letter'];
  map2[letter] = map2.containsKey(letter) ? map2[letter] + 1 : 1;
}

final output2 = map2.keys.toList(growable: false);
output2.sort((k1, k2) => map2[k2].compareTo(map2[k1]));

print(output2);  // [d, e, a, b, c, f]