如何按稳定顺序获取数组中最大n个元素的索引
解决数组最大n个元素索引的稳定排序问题
首先,我们来拆解你的需求:
- 从数组
a中找出最大的n个元素对应的索引 - 结果要按元素大小逆序排列(大元素在前)
- 元素大小相等时,保持它们在原数组中的出现顺序(稳定排序)
你的原代码a.each_with_index.max(n).map(&:last)得到的是[5,4,3,2],不符合预期的原因是:max(n)方法在比较元素值相等的[val, idx]对时,会默认按索引的大小来判断优先级——索引更大的对会被认为“更大”,所以它会先选索引4的3,再选索引3的3,破坏了原数组的出现顺序。
正确的解决方案
我们可以通过自定义排序规则来实现稳定的结果:
n = 4 a = [0, 1, 2, 3, 3, 4] result = a.each_with_index.sort_by { |val, idx| [-val, idx] }.take(n).map(&:last) puts result.inspect # => [5, 3, 4, 2]
代码解释
each_with_index:把数组转化为[元素值, 索引]的数组,比如这里会得到[[0,0], [1,1], [2,2], [3,3], [3,4], [4,5]]sort_by { |val, idx| [-val, idx] }:自定义排序规则:- 第一优先级:
-val——按元素值的降序排列(因为负号把升序变成了降序) - 第二优先级:
idx——当元素值相等时,按索引的升序排列,这样原数组中先出现的元素会排在前面
- 第一优先级:
take(n):取排序后的前n个元素map(&:last):提取每个元素对中的索引部分,得到最终结果
这样就能完美满足你的需求啦!
内容的提问来源于stack exchange,提问作者compsy
相关产品推荐
相关产品推荐

