我有一组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)

Ruby相关问答推荐

Ruby迭代器与函数.返回函数的第一个值,而不交互整个列表

Ruby PKCS7:添加;\r〃;字节正在 destruct 解密

是否应该在生产时缩小服务器代码?

如何在 Ruby 中生成一个包含 n 个唯一随机数的列表?

Ruby on Rails 中是否有简写 if(没有 else)语句?

如何在 Ruby 中初始化 Hash 中的数组

如何期望 RSpec should_receive 的一些(但不是全部)参数?

Ruby:如何卸载设计(uninstall Devise)?

如何在不按 Enter 的情况下获取单个字符?

在包含任意数量的嵌套散列和数组的散列中查找键/值对

Ruby 输出 Unicode 字符

Ruby数组each_slice_with_index?

Ruby 哈希默认值行为

与 String 相比,在 Ruby 中使用 StringIO 有哪些优势?

Ruby 多维数组

如何在数组中找到出现次数最多的项目

HAML 中 Javascript 中的 Ruby 方法

我们什么时候在 Rails 中使用 "||=" 运算符?它的意义是什么?

正则表达式,如何匹配多行?

*nix 是什么意思?