当您对两个索引同步(配对)数组进行排序时,如何维护索引?

问题描述 投票:0回答:1

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

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个回答
5
投票

你很近。

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

© www.soinside.com 2019 - 2024. All rights reserved.