如何通过排序方法将指定元素置于数组首位
强制指定元素为首的排序问题修复
字符串数组排序错误原因与修复
你原来的排序块只处理了当前元素x是目标值(Privacy)的情况,返回-1让x排在前面,但忽略了待比较元素y是目标值的场景:当y是Privacy而x不是时,x <=> y会返回正数,导致y(Privacy)被排到x后面,最终目标元素无法处于首位。
正确的排序逻辑需要同时判断x和y是否为目标值:
p ['Home', 'Contact', 'Profile', 'Jobs', 'Privacy'].sort do |x, y| if x == 'Privacy' -1 # x是目标值,排前面 elsif y == 'Privacy' 1 # y是目标值,x排后面 else x <=> y # 其他情况按字母序排序 end end
执行后会得到预期结果:["Privacy", "Contact", "Home", "Jobs", "Profile"]
Page对象数组排序错误原因与修复
同样的逻辑漏洞:你重写的<=>方法只处理了self.name是目标值(Jobs)的情况,当other.name是Jobs时,self.name <=> other.name会返回正数,导致other(Jobs)被排到self后面,无法成为首位。
此外,你的Page类缺少初始化方法来赋值name属性,需要补充完整。修复后的代码:
class Page include Comparable attr_reader :name def initialize(name) @name = name end def <=>(other) if self.name == 'Jobs' -1 # 当前对象是目标,排前面 elsif other.name == 'Jobs' 1 # 对比对象是目标,当前排后面 else self.name <=> other.name # 其他情况按name字母序排序 end end end # 测试排序 pages = [Page.new('Contact'), Page.new('Home'), Page.new('Jobs'), Page.new('Profile'), Page.new('Privacy')] p pages.sort.map(&:name) # 输出 ["Jobs", "Contact", "Home", "Privacy", "Profile"]
内容的提问来源于stack exchange,提问作者user1883793
相关产品推荐
相关产品推荐

