我试图从这个数组中获取前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]第二大?或者是否有更好的,更像红宝石的方式?
怎么样:
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)
| 归档时间: |
|
| 查看次数: |
134 次 |
| 最近记录: |