在Array中查找N个对象,这些对象使用Ruby在属性中具有最大值

时间:2013-11-06 05:22:08

标签: ruby arrays sorting find

我有一个对象数组,其中一个字段是这些对象的“得分”。

我知道如何获得具有最大值的对象:

array.max_by do |element|
  element.score
end

但是如何获得分数最高的N(例如3个)对象(有序)?考虑到阵列可能少于N个元素。

编辑:

所以,例如:

[{score:10}, {score:5}, {score:7}, {score:8}]和N = 3

应该返回:[{score:10}, {score:8}, {score:7}]

3 个答案:

答案 0 :(得分:3)

这是一种方式:

max = arr.max_by{|e| e.score}
max_all = arr.find_all{|e| e.score==max}.first(3)

<强>更新

ar = [{score:10}, {score:5}, {score:7}, {score:8}]
p ar.sort_by{|e| -e[:score]}.first(3)
# => [{:score=>10}, {:score=>8}, {:score=>7}]

答案 1 :(得分:1)

我认为@ArupRakshit答案是正确的,我会稍微编辑一下。

max = arr.max_by{|i| i.score}
max_all = arr.find_all{|i| i.score==max}

max_all = arr.select{|i| i.score == max}

这是因为@HommerSmith没有固定数量的输出它可能是3或更少或更多,我们只需找到最大字符串和所有那些长度相等的字符串

答案 2 :(得分:1)

在Ruby 2.2.0中,Enumerable#max_by可以使用一个可选的整数参数,使其返回一个条目数组而不是一个条目,所以这段代码可以工作:

records = [{score:10}, {score:5}, {score:7}, {score:8}]
p records.max_by(3) { |n| n[:score] }.sort_by { |n| -n[:score] }
# [{:score=>10}, {:score=>8}, {:score=>7}]

max_by的文档没有给我们任何关于如何对返回的数组进行排序的保证,因此我们必须自己对它进行排序,这有点令人难过。

这个答案并不比Arup的答案好多了,除了可能的效率提升,因为Ruby解释器不需要对整个列表进行排序,如果你的列表很大,这将是一个很大的好处。