Trier un tableau selon les éléments d'un autre ensemble

J'ai un tableau d'id de

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

et j'ai un autre tableau d'objets avec des id dans un ordre aléatoire

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

Maintenant, j'ai besoin de trier a2 en fonction de l'ordre d'id dans a1. Donc a2 doit maintenant devenir:

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

a1 peut être [3, 2, 5, 4, 1] ou dans n'importe quel ordre, mais a2 doit correspondre à l'ordre de id dans a1.

Je fais comme ceci:

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  

Mais c'est toujours susceptible de s'exécuter en O(n^2) si l'ordre des éléments de a2 est exactement l'inverse de a1. Quelqu'un peut-il me dire de la façon la plus efficace de tri a2?

InformationsquelleAutor Ari53nN3o | 2012-08-14