按重复元素 flutter 对列表进行排序

Sort a list by repeated elements flutter

提问人:Jaafar Melhem 提问时间:3/12/2022 最后编辑:MendelGJaafar Melhem 更新时间:3/12/2022 访问量:555

问:

我需要按最重复的元素对数组进行排序,如下所示:

List<String> list = ['x','y','z','x','y','y']

期望输出:

[y,y,y,x,x,z]
列出 Flutter 排序 Dart 重复项

评论

1赞 pskink 3/12/2022
List list = ['x','y','z','x','y','y']; final cnt = list .groupListsBy((i) => i) .map((k, v) => MapEntry(k, v.length)); list.sort((a, b) => cnt[b]!.compareTo(cnt[a]!)); print(list);
1赞 jamesdlin 3/12/2022
详细阐述 pskink 的评论,groupListsBy 扩展来自 .package:collection

答:

1赞 Mahdi Sharifi 3/12/2022 #1

您可以使用排序函数来完成。下面是一个工作示例:

void main() {
  List list = ['x', 'y', 'z', 'x', 'y', 'y'];
  List copyList = List.from(list);
  list.sort((var a, var b) {
    int numberOfA = copyList.where((element) => element == a).length;
    int numberOfB = copyList.where((element) => element == b).length;
    return numberOfB.compareTo(numberOfA);
  });
  print(list);
}

评论

1赞 quoci 3/12/2022
你也可以回来numberOfB.compareTo(numberOfA)
0赞 Mahdi Sharifi 3/12/2022
@quoci 好点子。谢谢你提到它。我将使用此语法更新我的答案,因为它更具可读性。
0赞 Thierry 3/12/2022
使用此解决方案,您将不必要地执行。在本例中,为 24 次而不是 3 次。copyList.where(...)numberOfX * numberOfY * numberOfZ * 2
-2赞 Emanuel Alves 3/12/2022 #2

使用排序函数的其他示例:

void main() {
  List list = ['x', 'y', 'z', 'x', 'y', 'y'];
  list.sort((a, b) => b.compareTo(a),);
}

有关 compareTo 的更多信息

评论

0赞 Community 3/12/2022
您的答案可以通过额外的支持信息得到改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。
2赞 Thierry 3/12/2022 #3

我建议将频率计算移到排序循环之外。

void main() {
  List<String> list = ['x', 'y', 'z', 'x', 'y', 'y'];
  Map<String, int> numberOf = {
    for (var x in list.toSet()) x: list.where((item) => item == x).length
  };
  print(list..sort((a, b) => numberOf[b]!.compareTo(numberOf[a]!)));
}

控制台日志

[y, y, y, x, x, z]