我正在尝试将音乐列表与releaseDate进行比较。但是我可以在没有releaseDate的情况下检索音乐,并且在对它们进行排序时遇到错误。
如何排序/比较可为空的日期时间并将空的releaseDate放在末尾?
_followedMusic.sort((a, b) {
if (a.releaseDate != null && b.releaseDate != null)
return a.releaseDate.compareTo(b.releaseDate);
else
// return ??
});
谢谢
答案 0 :(得分:2)
如果您查看compareTo
的文档:
与其他比较器时,返回类似Comparator的值。也就是说,如果此值在其他值之前排序,则返回负整数;如果此值在其他值之后排序,则返回正整数;如果此和其他值一起排序,则返回零。
https://api.dart.dev/stable/2.10.0/dart-core/Comparable/compareTo.html
因此,根据比较对象是在对象之前,相同位置还是之后,您的compareTo
应该只返回值-1
,0
或1
。当前对象。
因此,如果您希望将null
条目放在已排序列表的开头,则可以执行以下操作:
void main() {
final list = ['b', null, 'c', 'a', null];
list.sort((s1, s2) {
if (s1 == null && s2 == null) {
return 0;
} else if (s1 == null) {
return 1;
} else if (s2 == null) {
return -1;
} else {
return s1.compareTo(s2);
}
});
print(list); // [null, null, a, b, c]
}
或者如果您想在末尾使用null
:
void main() {
final list = ['b', null, 'c', 'a', null];
list.sort((s1, s2) {
if (s1 == null && s2 == null) {
return 0;
} else if (s1 == null) {
return 1;
} else if (s2 == null) {
return -1;
} else {
return s1.compareTo(s2);
}
});
print(list); // [a, b, c, null, null]
}
或者,如@lrn所建议的那样,以更短和更有效的方式制作最后一个示例(但可能不易读:)):
void main() {
final list = ['b', null, 'c', 'a', null];
list.sort((s1, s2) => s1 == null
? s2 == null
? 0
: 1
: s2 == null
? -1
: s1.compareTo(s2));
print(list); // [a, b, c, null, null]
}
答案 1 :(得分:0)
_followdMusic.map((date) => return date ?? 1900.01.01).toList().sort(...)
日期是伪代码,不确定如何编写。这样,您可以将所有未知日期都放在列表的末尾。