1

オブジェクトの配列があり、フィールドの 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

ここに1つの方法があります:

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は、返された配列がどのようにソートされるかについて保証されていないため、自分でソートする必要がありますが、これはちょっと悲しいことです。

この回答は、Ruby インタープリターがリスト全体をソートする必要がないため、効率が向上する可能性があることを除いて、Arup の回答よりもはるかに優れているわけではありません。これは、リストが大きい場合に大きな利点となります。

于 2014-09-26T05:27:12.400 に答える