【问题标题】:Ruby - complex sorting. Want part of the list to sort ascending, the other part to sort descendingRuby - 复杂的排序。希望列表的一部分升序排序,另一部分降序排序
【发布时间】:2016-06-23 21:35:42
【问题描述】:

我有多个排序标准

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

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

【问题讨论】:

  • 添加输入和所需的输出示例。

标签: ruby sorting


【解决方案1】:

只需对日期使用负值即可进行降序排序。

@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

【讨论】:

  • 我认为这不适用于例如字符串,你不会只是按照冻结的字符串排序吗? ruby-doc.org/core-2.3.1/String.html#method-i-2D-40
  • 我无法执行 -a.due_date,我收到以下错误“未定义方法 `-@' for 2015-08-06 09:33:00 UTC:Time”
  • 我为降序添加了一个 to_i,它可以工作。谢谢 SteveTurczyn
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 2022-01-09
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 2011-10-03
  • 2018-03-18
相关资源
最近更新 更多