(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 中同时进行过滤和排序?
假设我们给出:
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::today、Enumerable#filter_map、DateTime::strptime、DateTime#to_date、Array#sort 和 Enumerable#sort_by。请参阅 Time#strftime 了解
DateTime::strptime
使用的格式化指令。