有没有更好的方法在 Ruby 中进行过滤和排序?

问题描述 投票:0回答:1

(a) 有类似于下面的行

......, start Mon 10/30 10:08
......, start Thu 12/21 9:21

(b) 我想要做什么:按日期和时间对行进行排序,但想要删除从今天开始的行

(c) 下面是实现此功能的 Ruby 代码

time = Time.new

$mon = time.month
$mday = time.day

# ......

array_tmp = results_all.lines.reject do |x|
    times = x.split(/,/)[1].scan(/\d+/).map(&:to_i)
    times[0] == $mon &&  times[1] == $mday
end

array_tmp.sort_by {|x| x.split(/,/)[1].scan(/\d+/).map(&:to_i)}]

我的问题是:

有没有更好、更优雅的方法在 Ruby 中同时进行过滤和排序?

ruby sorting filter
1个回答
0
投票

假设我们给出:

arr = [
  "has , start Mon 10/30 10:08",
  "dog , start Thu 9/24 4:08",4
  "fleas , start Thu 12/21 9:21",
  "Saffi , start Thu 10/29 19:33",
  "My , start Thu 9/7 9:54"
]
today = Date.today
  #=> #<Date: 2023-12-21 ((2460300j,0s,0n),+0s,2299161j)>

然后可以写:

arr.filter_map do |s|
  dt = DateTime.strptime(s[/\d{1,2}\/\d{1,2} +\d{1,2}:\d{2}$/], '%m/%d %H:%M')
  [dt, s] unless dt.to_date == today 
end.sort.map(&:last)
  #=> ["My , start Thu 9/7 9:54",
  #    "dog , start Thu 9/24 4:08",
  #    "Saffi , start Thu 10/29 19:33",
  #    "has , start Mon 10/30 10:08"]

end.sort.map(&:last)
可以替换为
end.sort_by(&:first).map(&:last)
,预计速度会更快一些。

请参阅 Date::todayEnumerable#filter_mapDateTime::strptimeDateTime#to_dateArray#sortEnumerable#sort_by。请参阅 Time#strftime 了解

DateTime::strptime
使用的格式化指令。

© www.soinside.com 2019 - 2024. All rights reserved.