You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby中是否有更优雅的方式同时实现过滤与排序?

问题

现有格式如下的文本行:

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

需求:按日期时间对这些行进行排序,同时移除属于当天的行。

当前已实现功能的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中是否有更优、更优雅的方式同时完成过滤与排序操作?

优化方案

当然有更简洁优雅的实现方式,核心是避免重复解析每行的时间信息——原代码里reject和sort_by都做了一次split+scan操作,属于冗余计算。可以先将每行文本与解析后的时间数据绑定,再一次性完成过滤和排序:

today = Date.today

# 先为每行绑定对应的日期对象
processed_lines = results_all.lines.map do |line|
  time_segment = line.split(',')[1].strip
  target_date = Date.strptime(time_segment, 'start %a %m/%d %H:%M')
  [line, target_date]
end

# 过滤当天行、按日期排序、提取原文本
filtered_sorted_lines = processed_lines.reject { |_, date| date == today }
                                       .sort_by { |_, date| date }
                                       .map { |line, _| line }

优化点说明

  • 减少冗余计算:仅对每行做一次时间解析,避免原代码中两次拆分扫描的重复操作,性能更优
  • 可读性提升:用Date.strptime直接将时间字符串转为日期对象,逻辑清晰,比手动提取数字判断更不易出错
  • 规范编码:替换原代码中的全局变量$mon/$mday,用Date.today直接对比,符合Ruby编码规范

如果你的Ruby版本在2.6及以上,还可以用filter_map先过滤掉无效解析的行(若存在),不过这种方式会在排序时再次解析时间,所以更推荐第一种绑定数据的实现。


内容的提问来源于stack exchange,提问作者Bridge IC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 21:44:58