0

injectを使用して、この配列から上位 2 つの値を取得しようとしています。

a = [1, 2, 5, 7, 4, 9, 2]

b = a.inject(Array.new(2) {0}) {|r, e|
  if e > r[0]
    r[1] = r[0]
    r[0] = e
  end
}

'block in <main>': undefined method '[]' for nil:NilClass (NoMethodError)しかし、私は行でエラーが発生し続けますr[1] = r[0]

からの最大値と2 番目r[0]に大きい値を表すように変更するにはどうすればよいですか? それとも、より良い、よりルビーに似た方法がありますか?ar[1]

4

1 に答える 1

9

どうですか:

a.sort[-2, 2]
=> [7, 9]

逆の順序が必要な場合 (およびlast(2)from @mu を使用する場合):

a.sort.last(2).reverse
=> [9, 7]

inject次のループ反復で利用できるように、いわゆるメモオブジェクトがブロックから返されることが常に必要です。したがって、これでコードが修正されます。

b = a.inject([0, 0]) { |r, e|
  # Added fix from @Chuck
  if e > r[0] 
    r[0], r[1] = e, r[0] 
  elsif e > r[1] 
    r[1] = e 
  end
  r # <- add this line
}
于 2013-02-09T01:40:19.450 に答える