Ruby:如何找到最小数组元素的索引?

Posted

技术标签:

【中文标题】Ruby:如何找到最小数组元素的索引?【英文标题】:Ruby: How to find the index of the minimum array element? 【发布时间】:2011-06-25 06:08:33 【问题描述】:

有什么方法可以更优雅地重写它吗?我认为,这是一段糟糕的代码,应该重构。

>> a = [2, 4, 10, 1, 13]
=> [2, 4, 10, 1, 13]
>> index_of_minimal_value_in_array = a.index(a.min)
=> 3

【问题讨论】:

对此我不确定。也许是我过度焦虑。 我会说这是非常干净的,所以这里不需要“重构”。 @prostosuper:我不会删除它。这几乎是一个自我回答的问题,但尽管如此,人们试图获得数组中的最小元素索引,我发现这个问题很有帮助。因此,只需创建一个类似“显然没有比 a.index(a.min) 更好的解决方案”这样的答案并接受它:) 如果数组中有多个最小值怎么办?你想要第一个、最后一个还是全部?顺便说一句,我认为这是一个有价值的问题。 @prostosuper:你能先说说你为什么要寻找索引吗?如果你能描述更广泛的问题,也许需要一种不同的方法。 【参考方案1】:

我相信这只会遍历数组一次并且仍然易于阅读:

numbers = [20, 30, 40, 50, 10]           # => [20, 30, 40, 50, 10]
elem, idx = numbers.each_with_index.min  # => [10, 4]

【讨论】:

简洁的解决方案。不幸的是,Array#last 让它变得很丑 (ary.each_with_index.min.last)。 也许ary.each_with_index.min.second 更漂亮。【参考方案2】:

这只会遍历数组一次,而 ary.index(ary.min) 会遍历两次:

ary.each_with_index.inject(0) |minidx, (v,i)| v < a[minidx] ? i : minidx 

【讨论】:

ary.each_with_index.inject([Float::INFINITY,0]) |(mv,mi), (v,i)| v&lt;mv ? [v,i] : [mv,mi] 【参考方案3】:

阅读其他情况(查找所有且仅最后一个最小元素)会很有趣。

ary = [1, 2, 1]

# find all matching elements' indexes
ary.each.with_index.find_all |a,i| a == ary.min .map |a,b| b  # => [0, 2]
ary.each.with_index.map |a, i| (a == ary.min) ? i : nil .compact # => [0, 2]

# find last matching element's index
ary.rindex(ary.min) # => 2

【讨论】:

ary.each.with_index... 和 ary.each_with_index... 之间有什么明显区别吗?我发现 each_with_index 没有记录。但是 ary.methods.grep(/each_with_index/);是真的。 它们都记录在 Enumerator 中,Array 继承自该 Enumerator。 each.with_index 获取数组并向其添加索引,从而形成数组数组,内部数组包含原始元素和索引。然后您可以将其传递给其他转换器,例如mapeach_with_index 想要遍历数组的数组。这是一个微妙的区别,但我不想要 each 循环,我想转换。 问题不在于速度,而在于完成某事的替代方法。为什么选择这个?我不知道。【参考方案4】:

我其实很喜欢@andersonvom 的回答,它只需要循环数组一次就可以得到索引。

如果你不想使用ary.each_with_index.min,你可以这样做:

ary = [2,3,4,5,1]                                             # => [2,3,4,5,1]
_, index_of_minimal_value_in_array = ary.each_with_index.min  # => [1, 4]
index_of_minimal_value_in_array                               # => 4

【讨论】:

以上是关于Ruby:如何找到最小数组元素的索引?的主要内容,如果未能解决你的问题,请参考以下文章

编写在数字数组中查找元素索引的函数[重复]

如何在数组中找到最小值,不包括第一个索引

如何找到int数组Python的最小值和最大值的索引[重复]

寻找二维数组中唯一的行和列的索引,以及这些位置上元素的最小和。

在特定元素上查找排序数组的范围索引

如何返回数组中最小整数的索引?