根据另一个数组的元素对一个数组进行排序

我有一个ID数组

a1 = [1, 2, 3, 4, 5]

而且我还有另一个对象数组,其ID以随机顺序排列

a2 = [(obj_with_id_5), (obj_with_id_2), (obj_with_id_1), (obj_with_id_3), (obj_with_id_4)]

现在我需要根据a1中id的顺序对a2进行排序。所以a2现在应该变成:

[(obj_with_id_1), (id_2), (id_3), (id_4), (id_5)]

a1可以是[3、2、5、4、1]或任何顺序,但是a2应该对应于a1中id的顺序。

我喜欢这样:

a1.each_with_index do |id, idx|

found_idx = a1.find_index { |c| c.id == id }

replace_elem = a2[found_idx]

a2[found_idx] = a2[idx]

a2[idx] = replace_elem

end

但是,如果a2的元素顺序与a1完全相反,则仍然可能会耗费O(n ^ 2)的时间。有人可以告诉我排序a2的最有效方法吗?

回答:

hash_object = objects.each_with_object({}) do |obj, hash| 

hash[obj.object_id] = obj

end

[1, 2, 3, 4, 5].map { |index| hash_object[index] }

#=> array of objects in id's order

我相信运行时间将是O(n)

以上是 根据另一个数组的元素对一个数组进行排序 的全部内容, 来源链接: utcz.com/qa/419887.html

回到顶部