Ruby 查找数组中最大元素的所有索引
我有这样一个数组:Ruby 查找数组中最大元素的所有索引,ruby,arrays,Ruby,Arrays,我有这样一个数组: vals = [1,2,10,5,10,5,9,10] 我需要数组中最大元素的索引(在上面的示例10)。因此,在我的示例中,它应该吐出另一个数组: [2,4,7] 但是,当我对块使用#find_index时,我只能得到它匹配的第一个索引: [12] pry(main)> vals.find_index { |i| i == vals.max } => 2 我可以通过这样做得到我想要的,但似乎有些冗长: [14] pry(main)> results =
vals = [1,2,10,5,10,5,9,10]
我需要数组中最大元素的索引(在上面的示例10
)。因此,在我的示例中,它应该吐出另一个数组:
[2,4,7]
但是,当我对块使用#find_index
时,我只能得到它匹配的第一个索引:
[12] pry(main)> vals.find_index { |i| i == vals.max }
=> 2
我可以通过这样做得到我想要的,但似乎有些冗长:
[14] pry(main)> results = []
=> []
[15] pry(main)> vals.each_with_index do |elem, i|
[15] pry(main)* results << i if elem == vals.max
[15] pry(main)* end
=> [1, 2, 10, 5, 10, 5, 9, 10]
[16] pry(main)> results
=> [2, 4, 7]
[14]pry(main)>结果=[]
=> []
[15] pry(主)>VAL.each_和_索引do|elem,i|
[15] 撬(主)*结果[1,2,10,5,10,5,9,10]
[16] pry(主)>结果
=> [2, 4, 7]
有没有人想到一种更像ruby的方法来实现这一点?这有点混乱,但你可以做到:
vals = [ 1,2,10,5,10,5,9,10 ]
val_max = vals.max
result = vals.each_with_index.each_with_object([ ]) do |(v,i),a|
a << i if (v == val_max)
end
# => [ 2, 4, 7 ]
vals=[1,2,10,5,10,5,9,10]
val_max=val.max
结果=VAL。每个_带有_索引。每个_带有_对象([])do |(v,i),a|
a[2,4,7]
试试这个:
vals = [1, 2, 10, 5, 10, 5, 9, 10]
max_val = vals.max
vals.each_index.select{|i| vals[i] == max_val}
注意:如果您想避免两次通过(即一次获得最大值,然后再次迭代列表),请从中导出答案:
vals=[1,2,10,5,10,5,9,10]
最大值=val.first-1
指数=[]
VAL.each_和_索引do|n,idx|
如果n
为数组中的每个元素调用vals.max
不是一个好计划。对于每个元素,每次都必须在数组中旋转,所以你是O(N^2)。非常好的一点@tadman-我当然可以将max的值存储在它自己的变量中,以便于比较……但无论如何,你都会想到它。最好的方式,我很喜欢这个-非常红宝石!两种不同的选择,一根头发不同:只是。使用对象
,或VAL。每个对象都使用对象([])。使用索引
,使用块变量|(v,a),i
@CarySwoveland漂亮的优化。
vals = [1, 2, 10, 5, 10, 5, 9, 10]
max_val = vals.max
vals.each_index.select{|i| vals[i] == max_val}
vals = [ 1,2,10,5,10,5,9,10 ]
max_val = vals.first - 1
indices = []
vals.each_with_index do |n, idx|
if n < max_val
# Do nothing, but common case, so avoid second comparison
elsif n == max_val
indices << idx
elsif n > max_val
max_val = n
indices = [ idx ]
end
end
indices