使用inject的数组中的前2个值

sia*_*ame 0 ruby arrays

我试图从这个数组中获取前2个值inject,

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
}
Run Code Online (Sandbox Code Playgroud)

但我不断收到错误'block in <main>': undefined method '[]' for nil:NilClass (NoMethodError)在该行r[1] = r[0]

我怎么能改变它,以便r[0]代表最大值a,r[1]第二大?或者是否有更好的,更像红宝石的方式?

Cas*_*per 9

怎么样:

a.sort[-2, 2]
=> [7, 9]
Run Code Online (Sandbox Code Playgroud)

如果您需要相反的顺序(并使用last(2)@mu):

a.sort.last(2).reverse
=> [9, 7]
Run Code Online (Sandbox Code Playgroud)

到目前为止,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
}
Run Code Online (Sandbox Code Playgroud)

  • 或者`a.sort.last(2)` (3认同)