如何对包含Timestamp类型元素的数组进行排序?
解决Timestamp列表排序的void错误问题
错误原因
List.sort()是原地排序方法,返回值为void——它只会直接修改原列表,不会返回新的排序后列表。你报错的核心原因是把它当成了返回新列表的方法,写了类似var sorted = myarr.sort();的代码,试图将void类型赋值给变量,触发了类型错误。
正确排序方式
根据需求选择以下两种方案:
1. 原地修改原列表(无需保留原数据)
直接调用sort()方法,不要将它的返回值赋值给任何变量:
// 以Firebase Timestamp为例(该类已实现Comparable接口) List<Timestamp> myarr = [ Timestamp(seconds: 1620000000, nanoseconds: 0), Timestamp(seconds: 1610000000, nanoseconds: 500000000), ]; myarr.sort(); // 直接执行,原列表会被排序 // 此时myarr即为排序后的结果
如果是自定义的Timestamp类(未实现Comparable接口),需要传入自定义比较器:
myarr.sort((a, b) { // 先比较秒数,秒数相同再比较纳秒 int secCompare = a.seconds.compareTo(b.seconds); if (secCompare != 0) return secCompare; return a.nanoseconds.compareTo(b.nanoseconds); });
2. 生成新的排序后列表(保留原列表)
若需要保留原列表的原始状态,使用Dart 3.0及以上版本提供的List.sorted()方法,它会返回一个新的排序后的列表:
List<Timestamp> myarr = [/* 原始数据 */]; List<Timestamp> sortedArr = myarr.sorted(); // 原列表不变,sortedArr是排序后的新列表
自定义Timestamp类同样可以传入比较器:
List<Timestamp> sortedArr = myarr.sorted((a, b) { int secCompare = a.seconds.compareTo(b.seconds); if (secCompare != 0) return secCompare; return a.nanoseconds.compareTo(b.nanoseconds); });
内容的提问来源于stack exchange,提问作者user395980
相关产品推荐
相关产品推荐

