我需要两个数组来将索引对保持在一起:
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 }
}
我也觉得应该为这个问题提供一个更简单,更省时又省空间的解决方案。
答案 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]