Ruby中如何对哈希按分数排序,同分则按字母序排列并输出?
解决Ruby哈希多条件排序问题:分数降序+同分队名字母升序
嘿,这个需求其实用Ruby的排序方法就能轻松搞定!核心思路是多条件排序:先按分数从高到低排,分数相同的情况下再按队名的字母顺序从A到Z排。我给你一步步拆解实现方法:
完整代码示例
# 你的原始哈希 scores = { "Charlie" => 0, "Delta" => 5, "Beta" => 2, "Alpha" => 0 } # 第一步:按规则排序哈希 sorted_teams = scores.sort_by do |team_name, score| # 用[-score, team_name]作为排序依据: # -score 实现分数降序(负数越大,原分数越高) # team_name 实现同分情况下的字母升序 [-score, team_name] end # 第二步:按要求格式输出 sorted_teams.each_with_index do |(name, score), idx| puts "#{idx + 1}. #{name}, #{score} pts" end
运行这段代码后,你就能得到完全符合要求的输出:
- Delta, 5 pts
- Beta, 2 pts
- Alpha, 0 pts
- Charlie, 0 pts
原理解释
Ruby的sort_by方法会根据块返回的数组元素依次进行比较:
- 首先比较数组的第一个元素
-score:数值越大的排在越前面,等价于原分数从高到低排序; - 当两个元素的第一个值相等(也就是分数相同)时,会自动比较数组的第二个元素
team_name——Ruby字符串默认按字母升序排序,所以Alpha会排在Charlie前面,完美解决同分排序的问题。
另一种写法(用太空船运算符)
如果你更喜欢用sort方法配合太空船运算符<=>,也可以这么写,逻辑是完全一致的:
sorted_teams = scores.sort do |team_a, team_b| # 先比较分数,降序(b的分数减a的分数) score_result = team_b[1] <=> team_a[1] # 如果分数相同,再比较队名升序(a的队名减b的队名) score_result == 0 ? team_a[0] <=> team_b[0] : score_result end
两种写法都能达到你想要的效果,选你觉得更易读的就行~
内容的提问来源于stack exchange,提问作者user9666612
相关产品推荐
相关产品推荐

