我正在尝试通过一组疯狂的规则对 Ruby 1.8.7 中的单词数组进行排序。这可以简化为想要对不区分大小写的 .sort_by{|a| 进行排序a.downcase}
然后重新排序区分大小写,但前提是 2 个字符串相同。
我认为您可以只.downcase
只比较相等的字符串,然后只对这些字符串进行排序,其余的发送 0。但不,这对我不起作用。
这是我所拥有的:
["A", "a", "a.", "A.", "Ba", "ba"].sort_by{|a| a.downcase}.sort{|a,b| a.downcase==b.downcase ? a<=>b : 0 }
期望的输出:
["A", "a", "A.", "a.", "Ba", "ba"]
感谢您的帮助。
最佳答案
如果a.downcase == b.downcase
那么您想使用区分大小写的比较进行排序,对吗?这真的意味着你想按对排序 [a.downcase, a]
和 Ruby 中的数组逐个元素进行比较,因此您只需要:
array.sort_by { |s| [ s.downcase, s ] }
假设 sort_by
正在比较两个数组 a1
和 a2
看看哪个先走。那只是一个 a1 <=> a2
称呼。如果a1[0] != a2[0]
那么飞船运算符(operator)就不必查看数组的第二个元素来打破平局,因为没有平局并且<=>
可以回+1
或 -1
马上。如果a1[0] == a2[0]
然后a1[0] <=> a2[0]
是0
并且宇宙飞船必须查看第二个元素以了解如何打破平局(或者如果 a1 == a2
则保持平局不变)。这听起来像是您所追求的比较逻辑。
关于基于 if 语句的 Ruby 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38001024/