Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 使用inject的数组中的前2个值_Ruby_Arrays - Fatal编程技术网

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

Ruby 使用inject的数组中的前2个值,ruby,arrays,Ruby,Arrays,我正在尝试使用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”:在r[1]=r[0] 我如何更改它,使r[0]代表a中的最大值,而r[1]代表第二大值?或者有更好的、更像红宝石的方法吗?怎么样: a.sort[-2, 2] =>

我正在尝试使用
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”:在
r[1]=r[0]

我如何更改它,使
r[0]
代表
a
中的最大值,而
r[1]
代表第二大值?或者有更好的、更像红宝石的方法吗?

怎么样:

a.sort[-2, 2]
=> [7, 9]
如果您需要反向顺序(并使用@mu的
last(2)
):

inject
而言,它总是要求从块返回所谓的memo对象,以便在下一次循环迭代中可用。因此,这将修复您的代码:

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
}
b=a.inject([0,0]){r,e|
#添加了@Chuck的修复
如果e>r[0]
r[0],r[1]=e,r[0]
elsif e>r[1]
r[1]=e
结束

r#所谓“前2名”,你是指“最大的两名”还是“最频繁的两名”?我猜是“最大的两名”,所以你想要
[9,7]
。是的,很抱歉我没有说得更清楚。你的注入版本不太正确。如果当前值是目前发现的第二大值,你还需要一个分支来替换第二个值。基本上
如果e>r[0],那么r[0],r[1]=e,r[0]elsif e>r[1],那么r[1]=e end
谢谢@Chuck。添加了你的修复。
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
}