【发布时间】:2016-06-23 21:35:42
【问题描述】:
我有多个排序标准
我有一个我指定的排序顺序。 (我根据我的标准吐出1、2、3、4)
- 然后根据第 1 步的顺序,我使用不同的列进行排序。
- 当第 1 步产生 1 到 3 时,我需要第 2 步升序排序,当它是 4 时,我需要它降序。
我已经完成了第 1 步和第 2 步。停留在第 3 步。操作也很昂贵,所以如果可以避免的话,我不想多次迭代列表。
我知道我可以先将列表过滤成 2 个不同的数组(例如将 sort_order 1 到 3 分组到一个数组中)并将 sort_order 4 分组到另一个数组中,然后在第二个数组上调用 reverse。但这需要我多次迭代列表。
@assignments.sort_by do |a|
sort_date = if(a.sort_order == 1 || a.sort_order == 4)
a.due_date
else
a.start_date
end
[a.sort_order, sort_date]
end
示例输入 -
[{name: item 1, start_date: "08/01/2016", due_date: "08/15/2016", sort_order: 3},
{name: item 2, start_date: "08/02/2016", due_date: "08/20/2016", sort_order: 3},
{name: item 3, start_date: "06/01/2016", due_date: nil, sort_order: 2},
{name: item 4, start_date: "06/01/2016", due_date: "07/15/2016", sort_order: 1},
{name: item 5, start_date: "07/01/2016", due_date: "07/07/2016", sort_order: 1},
{name: item 6, start_date: "01/01/2015", due_date: "01/15/2015", sort_order: 4},
{name: item 7, start_date: "01/01/2016", due_date: "01/15/2016", sort_order: 4},]
预期输出的顺序
item 5
item 4
item 3
item 1
item 2
item 7
item 6
基本上按当前、未来、过去对作业进行排序。
- 当前作业可能没有结束日期,因此,它们会获得排序顺序 1 和 2,如果作业是当前的,则按截止日期排序,除非没有截止日期,然后按开始日期排序。
- 未来的作业,按开始日期升序排序。
- 过去的作业,按截止日期降序排列。
【问题讨论】:
-
添加输入和所需的输出示例。