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

标签 arrays ruby sorting heterogeneous-array

我有一个对象数组

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

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

[ <#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 : 0 保证,我们将 Fixnum 作为第一个元素,所以它应该没有错误。

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

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

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

关于arrays - 根据某些元素中可能为 nil 的属性对数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4475991/

相关文章:

Python:从文本文件导入列表并根据多列进行排序/平均

arrays - 将数组值插入 $scalar - Perl

ruby - Ruby 中的基本匹配

mysql - 适合mysql比较的Ruby datetime

ruby-on-rails - Ruby on Rails : Error messages not displaying since changing order of a list

python - 如何根据 idxmax 对数据框进行排序?

php - 从数组中取出一个值

java - 如何在java中打印数组中所有数字的总和?

javascript - 如何按数组成员求和

javascript - javascript中的父子关系排序