【问题标题】:Ruby - pick multiple max values from an array with their index [closed]Ruby - 从具有索引的数组中选择多个最大值[关闭]
【发布时间】:2021-10-23 01:43:53
【问题描述】:

说我有一个 数组 = [22, 55, 55, 16] 我想从数组中挑选出最大值及其索引。

【问题讨论】:

  • 你试过什么?为什么它不起作用?怎么没用?你有没有得到错误,错误的结果,行为是否出乎意料?你试图解决什么问题?为什么,以及您的修复失败的方式是什么?

标签: arrays ruby indexing max


【解决方案1】:

只需使用max 查找最大值并使用index/rindexselect 查找索引取决于您需要哪种索引

array = [22, 55, 55, 16] 
max_val = array.max # 55
first_indedx = array.index(max_val) # 1 - first index
index = array.rindex(max_val) # 2 - last index
array.each_index.select{|i| array[i] == max_val} # [1, 2] - all indexes

您可以在此处找到有关方法的更多详细信息:https://ruby-doc.org/core-2.7.0/Array.html

【讨论】:

    【解决方案2】:

    要找到Enumerable 的最大值,有恰当命名的方法Enumerable#maxEnumerable#max_by

    这是一个使用Enumerable#max(或更准确地说,它的重载Array#max)在array 中查找最大值的示例:

    array.max
    #=> 55
    

    如果您想要多个值,可以将 Integer 传递给 max,这将告诉 Ruby 您想要多少个值:

    array.max
    #=> 55
    
    array.max(1)
    #=> [55]
    
    array.max(2)
    #=> [55, 55]
    
    array.max(3)
    #=> [55, 55, 22]
    
    array.max(4)
    #=> [55, 55, 22, 16]
    
    array.max(5)
    #=> [55, 55, 22, 16]
    

    所以,现在我们知道如何获得任意数量的最大值。我们现在唯一缺少的就是索引。

    所以,我们要做的第一件事就是将每个值与其索引配对:

    array.each_with_index
    #=> #<Enumerator: ...>
    

    Enumerable#each_with_index 返回一个Enumerator,它将每个元素与其索引配对。我们可以采取peek 的样子:

    enum = array.each_with_index
    #=> #<Enumerator: ...>
    
    enum.peek
    #=> [22, 0]
    

    或者,我们可以查看整个Enumerator,通过使用Enumerable#to_a 方法将其转换为Array

    array.each_with_index.to_a
    #=> [[22, 0], [55, 1], [55, 2], [16, 3]]
    

    Arrays 是按字典顺序排列的,因此,Enumerable#max 将认为[55, 2] 大于[55, 1]

    array.each_with_index.max
    #=> [55, 2]
    
    array.each_with_index.max(1)
    #=> [[55, 2]]
    
    array.each_with_index.max(2)
    #=> [[55, 2], [55, 1]]
    
    array.each_with_index.max(3)
    #=> [[55, 2], [55, 1], [22, 0]]
    
    array.each_with_index.max(4)
    #=> [[55, 2], [55, 1], [22, 0], [16, 3]]
    
    array.each_with_index.max(5)
    #=> [[55, 2], [55, 1], [22, 0], [16, 3]]
    

    如果您可以选择array 末尾的相等值,那么我们就完成了!

    如果要在确定最大元素时忽略索引,我们可以使用Enumerable#max_by 方法,它允许我们通过自己的标准来确定最大值。我们可以通过Array#first 方法简单地告诉Enumerable#max_by 只使用第一个元素:

    array.each_with_index.max_by(&:first)
    #=> [55, 1]
    
    array.each_with_index.max_by(1, &:first)
    #=> [[55, 1]]
    
    array.each_with_index.max_by(2, &:first)
    #=> [[55, 2], [55, 1]]
    
    array.each_with_index.max_by(3, &:first)
    #=> [[55, 2], [55, 1], [22, 0]]
    
    array.each_with_index.max_by(4, &:first)
    #=> [[55, 2], [55, 1], [22, 0], [16, 3]]
    
    array.each_with_index.max_by(5, &:first)
    #=> [[55, 2], [55, 1], [22, 0], [16, 3]]
    

    你有它!最大 n 数字及其索引。

    【讨论】:

    • 哇。我从中学到了很多。但是,我真的很抱歉我在提问时没有遵循社区准则。因为我正在寻找的正是 M116 所回答的。我想我已经能够改进它的长度并提出:max_values_index = arr.each_index.select do |index|arr[index] == arr.maxend 现在我不确定如何编辑问题以使其符合准则。因为我不知道如何如此轻松地解决这个问题。只是一个笨拙的模糊想法。
    【解决方案3】:

    你可以这样做:

    $ irb
    irb(main):001:0> i = [22, 55, 55, 16]
    irb(main):003:0> i.each_with_index { |n, index| puts "#{n}:#{index}" if n == i.max }
    
    55:1
    55:2
    

    【讨论】:

    • 您正在为i 的每个元素计算n == i.max。这应该只做一次。
    • 感谢@CarySwoveland - 数组中只有 4 个项目我忽略了这一点,但你是对的,它应该只计算一次。
    猜你喜欢
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2021-04-10
    • 2018-06-06
    • 2019-02-04
    • 2015-03-24
    相关资源
    最近更新 更多