我正在使用Ruby 2.4,我有一组数字:
matches
如何找到与数组中第二大值对应的数组索引?您可以假设数组中至少有两个元素。
答案 0 :(得分:10)
试试这个。 a
是你的数组
a.index(a.max(2).last)
答案 1 :(得分:1)
a = [1,3,1,2]
当1
和1
被视为a
def second_largest_not_uniq(a)
a.each_index.min_by(2) { |i| a[i] }[1]
end
second_largest_not_uniq [1,3,1,2] #=> 2
second_largest_not_uniq [1] #=> nil
second_largest_not_uniq [] #=> nil
当1
和2
被视为a
def second_largest_uniq(a)
a.each_index.to_a.uniq { |i| a[i] }.min_by(2) { |i| a[i] }[1]
end
second_largest_uniq [1,3,1,2] #=> 3
second_largest_uniq [1,1,1] #=> nil
second_largest_uniq [] #=> nil
second_largest_uniq [1] #=> nil
答案 2 :(得分:0)
如果您需要值
,请尝试此操作value = array.max(2).last
如果您需要索引
,请尝试此操作index = array.each_with_index.max_by(2, &:first).last.last
这是如何运作的?
each_with_index
创建一个元组为[element, index]
max_by(2, &:first)
找到两个最大的元组,比较它们的第一个值,即元素last
获得第二大元组last
通过获取最后一个值(即索引注意,这会创建O(n)
个临时数组,因为我们链接each_with_index
枚举器,我不会将它用于性能关键代码路径中的大型数组。
答案 3 :(得分:-1)
我对数组进行排序然后使用类似:
ary.size - 2
例如:
ary = 5.times.map{ rand(100) } # => [61, 75, 35, 48, 59]
ary.sort # => [35, 48, 59, 61, 75]
ary.sort[-2] # => 61
ary.size - 2 # => 3
ary.sort[ary.size - 2] # => 61
这不会返回原始数组中元素的索引。
排序后第二大元素的索引始终为array.size - 2
。
如果阵列必须按原始顺序排列,我就这样做:
ary = 5.times.map{ rand(100) } # => [83, 72, 4, 63, 68]
hash = ary.each_with_index.to_h # => {83=>0, 72=>1, 4=>2, 63=>3, 68=>4}
hash.sort[-2] # => [72, 1]
此时hash.sort[-2]
返回原始数组中的值及其索引。 72
是值,ary[1]
是值的索引。