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

时间:2019-04-20 06:23:04

标签: arrays ruby algorithm sorting

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

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  }
}

我也觉得应该为这个问题提供一个更简单,更省时又省空间的解决方案。

1 个答案:

答案 0 :(得分: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