0

我正在尝试使用从该数组中获取前 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
}

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

我怎样才能改变它,以便r[0]代表 中的最大值ar[1]第二大值?还是有更好的,更像红宝石的方式?

4

1 回答 1

9

怎么样:

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

如果您需要相反的顺序(并使用last(2)来自@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 回答