Ruby - 复杂排序。希望列表的一部分按升序排序,另一部分要按降序排序

时间:2016-06-23 21:35:43

标签: ruby sorting

我有多个排序标准

  1. 我有一个我指定的排序顺序。 (我根据我的标准吐出1个,2个,3个,4个)

  2. 然后根据步骤1中的顺序,我使用不同的列进行排序。
  3. 当步骤1产生1到3时,我需要步骤2来升序排序,当它是4时,我需要它下降。
  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. 当前分配可能没有结束日期,因此,它们会获得排序顺序1和2,如果分配是最新的,则按截止日期对其进行排序,除非没有截止日期,然后按开始日期对其进行排序。
    2. 未来分配,按开始日期升序排序。
    3. 过去的作业,按到期日降序排序。

1 个答案:

答案 0 :(得分:2)

只需使用日期的负值来降序排序。

@assignments.sort_by do |a|

  case a.sort_order
  when 1 then [1, a.due_date]
  when 2 then [2, a.start_date]
  when 3 then [3, a.start_date]
  when 4 then [4, -a.due_date]
  end
end