1

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

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

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}]

4

3 回答 3

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}]
于 2013-11-06T05:24:26.943 回答
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或更少或更多,我们只需要找到最大字符串和所有长度相等的字符串

于 2013-11-06T05:47:02.413 回答
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 解释器不需要对整个列表进行排序,如果您的列表很大,这将是一个很大的好处。

于 2014-09-26T05:27:12.400 回答