我有一个对象数组,其中一个字段是这些对象的“得分”。
我知道如何获得具有最大值的对象:
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}]
答案 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解释器不需要对整个列表进行排序,如果你的列表很大,这将是一个很大的好处。