You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按稳定顺序获取数组中最大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]

代码解释

  1. each_with_index:把数组转化为[元素值, 索引]的数组,比如这里会得到[[0,0], [1,1], [2,2], [3,3], [3,4], [4,5]]
  2. sort_by { |val, idx| [-val, idx] }:自定义排序规则:
    • 第一优先级:-val——按元素值的降序排列(因为负号把升序变成了降序)
    • 第二优先级:idx——当元素值相等时,按索引的升序排列,这样原数组中先出现的元素会排在前面
  3. take(n):取排序后的前n个元素
  4. map(&:last):提取每个元素对中的索引部分,得到最终结果

这样就能完美满足你的需求啦!

内容的提问来源于stack exchange,提问作者compsy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:09:56