数组 – 根据某些元素中可能为零的属性对数组进行排序

我有一个对象数组
[<#a star=1  val=1>,<#a star=nil val=3>,<#a star=2  val=2>]

我需要按时间排序的数组,然后按val排序

[ <#a star=2  val=2>,<#a star=1  val=1>,<#a star=nil val=3> ]

但是使用sort_by会抛出一个错误,因为时间是零.

我现在使用一种丑陋的方式来排序,但我确定有一个很好的方法去做

starred=[]
@answers.each {|a| (starred << a) if a.starred }
@answers=@answers-starred
starred=starred.sort_by {|a| a.starred }.reverse
@answers=starred+@answers

解决方法

starred.sort_by { |a| [a ? 1 : 0,a] }

当它必须比较两个元素时,它比较一个数组.当Ruby比较数组(调用===方法)时,它比较第一个元素,只有当第1个元素相等时才转到第2个元素. ? 1:0保证,我们将Fixnum作为第一个元素,所以应该没有错误.

如果你这样做? 0:1,nil将出现在数组的末尾,而不是开始.
这是一个例子:

irb> [2,5,1,nil,7,3,4,6].sort_by { |i| [i ? 1 : 0,i] }
=> [nil,2,6,7]

irb> [2,6].sort_by { |i| [i ? 0 : 1,i] }
=> [1,nil]

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...