【问题标题】:How do you maintain an index when you sort two index synced (paired) arrays?对两个索引同步(配对)数组进行排序时,如何维护索引?
【发布时间】:2019-09-10 06:11:36
【问题描述】:

我有两个数组需要将索引对保持在一起:

arr1 = [17,9,8,20,14,16]
arr2 = [27,13,10,10,24,18]

我想把它们都归还为:

arr1 = [8,9,14,16,17,20]
arr2 = [10,13,24,18,27,10]

我试过arr1.each.zip(arr2.each).sort,它给了我:[[8, 10], [9, 13], [14, 24], [16, 18], [17, 27], [20, 10]]。我希望有一种更快的方法来维护数组。

然后我转到transpose,它让我找到了我的嵌套数组,但我似乎无法让地图正确地修复我的原始数组。

arr1.each.zip(arr2.each).sort.transpose.map {
 |a_1| a1.map { |a_2| arr1 = a_1; arr2 = a_2  }
}

我也觉得应该有一个更简单的更少时间和空间复杂的解决方案。

【问题讨论】:

    标签: arrays ruby algorithm sorting


    【解决方案1】:

    你很亲密。

    arr1 = [17,9,8,20,14,16]
    arr2 = [27,13,10,10,24,18]
    
    arr1, arr2 = arr1.zip(arr2).sort.transpose
      #=> [[8, 9, 14, 16, 17, 20], [10, 13, 24, 18, 27, 10]] 
    arr1
      #=> [8, 9, 14, 16, 17, 20] 
    arr2
      #=> [10, 13, 24, 18, 27, 10] 
    

    请注意,如果arr1 包含重复项,则arr2 中的相应值将在排序中中断。

    如果您只想按arr1 排序,另一种方法如下。

    sorted_indices = arr1.each_index.sort_by { |i| arr1[i] }
      #=> [2, 1, 4, 5, 0, 3] 
    arr1 = arr1.values_at(*sorted_indices)
      #=> [8, 9, 14, 16, 17, 20] 
    arr2 = arr2.values_at(*sorted_indices)
      #=> [10, 13, 24, 18, 27, 10] 
    

    请参阅 Enumerable#sort_byArray#values_at

    【讨论】:

    • 我试图解决这个问题,我得到了你的第一个解决方案。我开始看到您的答案,您的第一个解决方案与我的完全相似。然后看了你的第二个,太棒了!
    • arr1.zip(arr2).sort_by(&:first).transpose 解决了 dups 问题。
    猜你喜欢
    • 2013-06-09
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 2021-04-12
    相关资源
    最近更新 更多