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