我有一个列表,希望在其中基于两个值日期和状态进行排序:
pollsList.sort((a, b) => b.active.compareTo(a.active));
pollsList.sort((a, b) {
return b.actualStartDatetime.compareTo(a.actualStartDatetime);
});
其中active == 90(如果处于活动状态)和-90(如果未处于活动状态)。
我想根据日期对列表进行排序,然后根据日期进行排序
我想要最新的显示在顶部,并且总是关闭在活动项之后
但这将导致列表仅按日期排序
如何按两个值对它进行排序?
答案 0 :(得分:1)
您希望对列表进行排序,以便在较早的开始时间之前对较晚的开始时间进行排序,如果两个元素具有相同的开始时间,则在不活动的元素之前对活动的元素进行排序。
您试图对列表进行两次排序。仅当排序算法为 stable 时,即元素等于wrt时,这才起作用。第二个排序比较保持第一个排序的顺序。 Dart的排序不能保证稳定,因此这不是安全的方法。即使看起来可行,也有可能采用一种对小列表稳定的排序算法,而不对大列表稳定。
您应该做的是创建一个比较函数,该函数一次完成两个比较。首先比较开始时间。如果这些不相等,则说明您已完成,否则也要比较活动。
pollsList.sort((a, b) {
int cmp = b.actualStartDatetime.compareTo(a.actualStartDatetime);
if (cmp != 0) return cmp;
return b.active.compareTo(a.active);
});
如果要在所有活动元素之前对所有不活动元素进行排序,然后按开始时间对这些组中的每个组进行排序,则可以按相反的顺序进行比较:
pollsList.sort((a, b) {
int cmp = b.active.compareTo(a.active);
if (cmp != 0) return cmp;
return b.actualStartDatetime.compareTo(a.actualStartDatetime);
});
答案 1 :(得分:0)
我通过将两列合二为一来解决这个问题。 “${a.active}${a.actualStartDatetime}”并将其与 b 进行比较。
data.sort((a, b) => ("${a.active}${a.actualStartDatetime}").toString()
.compareTo(("${b.status}${b.actualStartDatetime.toUpperCase()}").toString()));