如何根据两个值对列表进行排序

mrs*_*tat 7 dart flutter

我有一个列表,我想在其中根据两个值日期和状态进行排序,如下所示:

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

  pollsList.sort((a, b) {
    return b.actualStartDatetime.compareTo(a.actualStartDatetime);
  });
Run Code Online (Sandbox Code Playgroud)

其中 active == 90 如果它是活动的,-90 如果不是 ..

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

我希望最新的在顶部,并且总是在活动项目之后关闭

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

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

lrn*_*lrn 11

您希望对列表进行排序,以便将较晚的开始时间排在较早的开始时间之前,并且如果两个元素具有相同的开始时间,则将活动元素排序在非活动元素之前。

您尝试对列表进行两次排序。这仅在排序算法稳定时才有效,也就是说,如果元素等于wrt。第二次排序比较保持在第一次排序时的顺序。Dart 的排序并不能保证稳定,因此这不是一种安全的方法。即使它看起来有效,也很可能有一个对小列表稳定而不是对大列表稳定的排序算法。

你应该做的是创建一个单一的比较函数,同时进行两个比较。首先比较开始时间。如果这些不相等,您就完成了,否则也比较活动。

pollsList.sort((a, b) {
  int cmp = b.actualStartDatetime.compareTo(a.actualStartDatetime);
  if (cmp != 0) return cmp;
  return b.active.compareTo(a.active);
});
Run Code Online (Sandbox Code Playgroud)

如果您希望将所有非活动元素排在所有活动元素之前,然后按开始时间对这些组中的每一个进行排序,则以相反的顺序进行比较:

pollsList.sort((a, b) {
  int cmp = b.active.compareTo(a.active);
  if (cmp != 0) return cmp;
  return b.actualStartDatetime.compareTo(a.actualStartDatetime);
});
Run Code Online (Sandbox Code Playgroud)

  • 这是相同的..将在打开的列表中间显示一些关闭的... (2认同)

小智 11

我通过将两列合二为一来解决这个问题。“${a.active}${a.actualStartDatetime}”并将其与 b 进行比较。

data.sort((a, b) =>  ("${a.active}${a.actualStartDatetime}").toString()
.compareTo(("${b.status}${b.actualStartDatetime.toUpperCase()}").toString()));
Run Code Online (Sandbox Code Playgroud)