【发布时间】:2021-10-23 01:43:53
【问题描述】:
说我有一个 数组 = [22, 55, 55, 16] 我想从数组中挑选出最大值及其索引。
【问题讨论】:
-
你试过什么?为什么它不起作用?怎么没用?你有没有得到错误,错误的结果,行为是否出乎意料?你试图解决什么问题?为什么,以及您的修复失败的方式是什么?
说我有一个 数组 = [22, 55, 55, 16] 我想从数组中挑选出最大值及其索引。
【问题讨论】:
只需使用max 查找最大值并使用index/rindex 或select 查找索引取决于您需要哪种索引
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
【讨论】:
要找到Enumerable 的最大值,有恰当命名的方法Enumerable#max 和Enumerable#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 数字及其索引。
【讨论】:
max_values_index = arr.each_index.select do |index|arr[index] == arr.maxend 现在我不确定如何编辑问题以使其符合准则。因为我不知道如何如此轻松地解决这个问题。只是一个笨拙的模糊想法。
你可以这样做:
$ 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。这应该只做一次。