Ruby:根据某些测试日期的接近度来排序日期

时间:2017-09-14 21:01:05

标签: ruby-on-rails ruby sorting

我有一系列日期。我需要通过 closeness 将这些日期排序到某个test_date。数组中的日期可以是之前的之后的那个test_date。

我简单的ruby程序并没有让它正确。我的策略是将每个Date转换为unix时间戳。然后我根据日期和test_date之间的差值的绝对值进行自定义排序。

这是该计划:

require 'date'
test_date = DateTime.new(2017,2,3,4,5,6)

date1 = Date.new(2017,1,6)
date2 = Date.new(2017,1,5)
date3 = Date.new(2017,2,5)
date4 = Date.new(2017,2,6)
date5 = Date.new(2017,2,9)
date6 = Date.new(2017,2,1)
date7 = Date.new(2017,2,2)

dates_ary = date1, date2, date3, date4, date5, date6, date7

sorted_dates = dates_ary.sort do |d1, d2|
    if( (d1.to_time.to_i - test_date.to_time.to_i).abs <= (d2.to_time.to_i - test_date.to_time.to_i).abs)
        d1 <=> d2
    else
        d2 <=> d1
    end
end

puts "expected order: "
puts "2017-02-02"
# pointed out in comments that 2017-02-05 will be closer than 2017-02-01 due to test_date having present hours, minutes, and seconds.
puts "2017-02-05"
puts "2017-02-01"
puts "2017-02-06"
puts "2017-02-09"
puts "2017-01-06"
puts "2017-01-05"
puts ''

puts 'actual order:'
sorted_dates.each {|d| puts d}

另外:如果有一些现有的ruby或rails方法根据与其他日期的接近程度对日期进行排序,请告诉我。谢谢!

1 个答案:

答案 0 :(得分:3)

library(dplyr) library(tidyr) df2 <- df %>% group_by(group,number) %>% summarise(data=toString(id),count=n())%>%separate_rows(data)%>% mutate(Col = paste0("data", 1:n()))%>%spread(Col, data) df2 # A tibble: 4 x 8 # Groups: group [2] group number count data1 data2 data3 data4 data5 * <fctr> <fctr> <int> <chr> <chr> <chr> <chr> <chr> 1 A abcd 3 1 2 3 <NA> <NA> 2 A efgh 2 <NA> <NA> <NA> 4 5 3 B abcd 4 1 2 3 9 <NA> 4 B ijkl 1 <NA> <NA> <NA> <NA> 10 是多余的。 Ruby会处理它:

if

更好:

sorted_dates = dates.sort do |d1, d2|
  (d1.to_time.to_i - test_date.to_time.to_i).abs <=> (d2.to_time.to_i - test_date.to_time.to_i).abs
end

更好:

sorted_dates = dates.sort_by do |date|
  (date.to_time.to_i - test_date.to_time.to_i).abs
end