我正在尝试按频率对列表进行排序。
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}, ...]
答案 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]