Ruby如何按星期名称排序哈希以计算会议空闲时间段
日程排序实现方法
你可以通过「自定义星期权重+时间转数值」的方式完成排序,不需要修改原有哈希结构,实现逻辑如下:
- 首先定义星期缩写对应的排序权重,解决字符串星期无法按自然周顺序排序的问题
- 排序时将会议开始时间转换为当日0点起累计的分钟数,作为同天内会议的排序依据
- Ruby的
sort_by方法支持数组形式的排序键,会按数组元素的优先级依次完成对比排序
具体实现代码
# 星期权重映射,可根据业务的周起始规则调整 # 如果周日为一周第一天,就把"Sun"的映射值改为0,其余依次后移即可 DAY_ORDER = { "Mon" => 0, "Tue" => 1, "Wed" => 2, "Thu" => 3, "Fri" => 4, "Sat" => 5, "Sun" => 6 } sorted_schedule = schedule_hash.sort_by do |item| # 第一排序维度:星期的先后顺序 day_rank = DAY_ORDER[item[:day]] # 第二排序维度:同天内按会议开始时间从早到晚排列 start_hour, start_min = item[:time].split('-').first.split(':').map(&:to_i) start_total_min = start_hour * 60 + start_min [day_rank, start_total_min] end
排序效果说明
执行上述代码后,示例日程会按如下顺序排列,可直接用于后续空闲时间计算:
- Mon 05:00-13:00
- Mon 15:00-21:00
- Tue 03:30-18:15
- Tue 19:00-20:00
- Wed 04:25-15:14
- Wed 15:14-22:40
- Thu 00:00-23:59
- Fri 05:00-10:00
- Fri 16:30-23:50
- Sat 02:00-06:00
- Sat 10:00-24:00
- Sun 01:00-04:00
- Sun 10:00-20:00
后续计算提示
排序完成后遍历日程即可计算空闲时长:
- 同天内的空闲时长 = 下一场会议开始时间(转分钟) - 上一场会议结束时间(转分钟),结果为正就是有效空闲
- 跨天空闲需要单独计算:当天最后一场会议结束到24:00的时长,加次日00:00到第一场会议开始的时长
- 示例中周四的会议结束时间是23:59,到周五0点仅有1分钟间隔
内容的提问来源于stack exchange,提问作者mr_muscle
相关产品推荐
相关产品推荐

