【问题标题】:Find the index by current sort order of an array in ruby按 ruby​​ 中数组的当前排序顺序查找索引
【发布时间】:2016-06-23 15:26:30
【问题描述】:

如果有数组

array A = ["a","b","c","d"] #Index is [0,1,2,3]

它被排序到。

array A = ["d","c","b","a"]

我需要一个根据排序顺序返回更新索引的数组

[3,2,1,0]

我正在尝试找到解决此红宝石的方法

更新问题

如果 a 排序为

array A = ["d","b","c","a"] #not a pure reverse

那么返回的索引数组应该是

[3,1,2,0]

【问题讨论】:

  • 欢迎来到 SO。请阅读“How to Ask”。我们希望看到您为解决问题所做的努力。你写代码了吗?如果是这样,请阅读“minimal reproducible example”。我们不会为您编写代码,但我们会帮助您修复代码。

标签: arrays ruby sorting


【解决方案1】:

您需要创建一个保留原始顺序的映射表,然后使用该顺序取消映射重新排序的版本:

orig = %w[ a b c d ]
orig_order = orig.each_with_index.to_h

revised = %w[ d c b a ]

revised.map { |e| orig_order[e] }
# => [3, 2, 1, 0]

只要您的元素是独一无二的,它就能够按顺序跟踪任何变化。

【讨论】:

    【解决方案2】:

    这是一种方法:

    original_array = ["a","b","c","d"]
    jumbled_array = original_array.shuffle
    
    jumbled_array.map {|i| original_array.index(i)}
    #=> [1, 3, 0, 2] 
    

    注意:

    1. 在此示例中,每次运行的输出都会发生变化,因为我们使用 shuffle 来演示解决方案。
    2. 该解决方案仅在数组没有重复值时才有效。

    如果您确实希望解决使用具有重复值的数组的问题,那么一种可能性是查看数组成员的object_id,同时找出索引。

    jumbled_array.map {|i| original_array.map(&:object_id).index(i.object_id)}
    

    只要jumbled_array 包含来自original_array 的元素并且没有使用dup 或导致object_id 值发生变化的东西重新创建任何元素,此解决方案就可以工作

    【讨论】:

      【解决方案3】:

      您可以使用mapindex 方法。

      arr = ["a","b","c","d"]
      
      sort_arr = ["d","c","b","a"]
      
      sort_arr.map{|s| arr.index(s)}
      # => [3, 2, 1, 0]
      

      【讨论】:

      • 很好的简单解决方案,但如果数组变大,性能方面可能会失控。如果数组中有重复的元素会发生什么,期望的行为是什么?
      • @AndrewSchwartz 是的,如果数组变大可能是性能问题,在这种情况下,我会推荐使用一些Hash 方式。重复的元素将是问题,但答案没有指定这种情况下的行为。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 2016-10-27
      • 2011-05-16
      • 1970-01-01
      • 2013-07-24
      相关资源
      最近更新 更多