如何基于两个值对列表进行排序

时间:2019-04-30 12:09:47

标签: dart flutter

我有一个列表,希望在其中基于两个值日期和状态进行排序:

pollsList.sort((a, b) => b.active.compareTo(a.active));

  pollsList.sort((a, b) {
    return b.actualStartDatetime.compareTo(a.actualStartDatetime);
  });

其中active == 90(如果处于活动状态)和-90(如果未处于活动状态)。

我想根据日期对列表进行排序,然后根据日期进行排序

我想要最新的显示在顶部,并且总是关闭在活动项之后

但这将导致列表仅按日期排序

如何按两个值对它进行排序?

2 个答案:

答案 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()));