在 Ruby 中,获取数组中最大值的索引的最简洁方法是啥?

Posted

技术标签:

【中文标题】在 Ruby 中,获取数组中最大值的索引的最简洁方法是啥?【英文标题】:In Ruby, what is the cleanest way of obtaining the index of the largest value in an array?在 Ruby 中,获取数组中最大值的索引的最简洁方法是什么? 【发布时间】:2011-01-10 02:59:58 【问题描述】:

如果a 是数组,我想要a.index(a.max),但更像Ruby。这应该很明显,但是我在某处和其他地方找不到答案。显然,我是 Ruby 新手。

【问题讨论】:

我想你已经明白了。那有什么不像红宝石的? 本,我在寻找类似 a.max_index 的东西。猜猜它不是内置的。 即使你想要的功能没有内置,你仍然可以在Array类中添加一个.max_index成员。下面是使用自定义成员扩展 StringInteger 的示例:hawkee.com/snippet/1260 【参考方案1】:

对于 Ruby 1.8.7 或更高版本:

a.each_with_index.max[1]

它进行一次迭代。不完全是有史以来最语义化的事情,但如果你发现自己经常这样做,我无论如何都会将它包装在 index_of_max 方法中。

【讨论】:

哇。这是如何做到的? Chuck,我知道这种方法,但认为 Ruby 有办法只返回索引。 (对于任何其他 Ruby 新手,a.each_with_index.max 返回数组 [最大值,最大值的索引],因此 Chuck 只是提取了第二个元素。) each_with_index 没有块返回一个枚举器,它给出了项目及其索引。然后我们将max 发送给这个枚举器,它在项目索引对上执行标准的max 算法。 Array.<=> 的实现是为了让第一项确定顺序(除非有平局,在这种情况下比较第二项,依此类推),所以这与在值本身的数组上执行 max 基本相同.然后为了得到索引,我们要求结果的第二项(因为我们从each_with_index得到了一系列[value, index]对)。 @bergyman 它不只比较第一个元素。它开始与第一个元素进行比较,但如果第一个元素相等,它将继续到后续元素。因此,如果数组中有多个最大元素,则此解决方案将给出最后一个。 经过许多个月后我才回到这个问题,并注意到当数组a 包含多个最大值时,a.index(a.max) 将返回第一个的索引,a.each_with_index.max[1] 将返回最后一个的索引,因此选择使用哪个可能取决于上下文。【参考方案2】:

在 ruby​​ 1.9.2 中我可以做到这一点;

arr = [4, 23, 56, 7]
arr.rindex(arr.max)  #=> 2

【讨论】:

这基本上是不需要的原始解决方案的更糟糕的版本。【参考方案3】:

我想回答这个问题:

a = (1..12).to_a.shuffle
# => [8, 11, 9, 4, 10, 7, 3, 6, 5, 12, 1, 2]
a.each_index.max_by  |i| a[i] 
# => 9

【讨论】:

【参考方案4】:

只是想注意此处某些解决方案的行为和性能差异。 重复最大元素的“打破平局”行为:

a = [3,1,2,3]
a.each_with_index.max[1]
# => 3
a.index(a.max)
# => 0

出于好奇,我在Benchmark.bm 中运行了它们(对于上面的a):

user     system      total        real
each_with_index.max  0.000000   0.000000   0.000000 (  0.000011)
index.max  0.000000   0.000000   0.000000 (  0.000003)

然后我用Array.new(10_000_000) Random.rand 生成了一个新的a 并重新运行测试:

user     system      total        real
each_with_index.max
  2.790000   0.000000   2.790000 (  2.792399)
index.max  0.470000   0.000000   0.470000 (  0.467348)

这让我觉得除非你特别需要选择更高的索引最大值,否则a.index(a.max) 是更好的选择。

【讨论】:

【参考方案5】:
a = [1, 4 8]
a.inject(a[0]) |max, item| item > max ? item : max 

至少它类似于 Ruby :)

【讨论】:

该死!我正在使用注入来制作解决方案 - 你打败了我! ;) 另外 - 原始问题是获取索引,因此必须将其更改为:a.inject(0) |index, num|数字 > a[索引] ? a.find_index(num) : 索引【参考方案6】:

这是一种获取最大值的所有索引值(如果大于一个)的方法。

给定:

> a
=> [1, 2, 3, 4, 5, 6, 7, 9, 9, 2, 3]

您可以通过以下方式找到所有最大值(或任何给定值)的索引:

> a.each_with_index.select |e, i| e==a.max.map &:last
=> [7, 8]

【讨论】:

您可以使用each_with_object 加上with_index 并跳过map(&:last)a.each_with_object([]).with_index |(e, arr), i| arr << i if e == a.max .

以上是关于在 Ruby 中,获取数组中最大值的索引的最简洁方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Java中数组获取最大值

使用 Ruby 验证 Google 登录访问令牌的最简洁方法

在 Express/EJS 模板中,循环数组的最简洁方法是啥?

在numpy数组中找到最大上三角条目索引的有效方法?

第三节 java 数组(循环遍历获取数组的最值(最大值和最小值)选择排序冒泡排序练习控制台输出大写的A)

在R中的排序向量中获取索引的最有效方法?