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
}