给定有序的id列表对对象数组进行排序

我有一个@users对象集合,每个对象都有id属性。

 @users = [#, #] 

我也有一个有序的ids数组。

 ids = [2,1] 

¿是否有一种使用该ID列表对集合进行排序的神奇方法? 如果可能的话,不要再次调用数据库。

谢谢 !!!

试试这个。 首先,从id – > user构建反向映射。

 ids_users = {} @users.each {|user| ids_users[user.id] = user} 

然后,使用id命令

 ids.collect{ |id| ids_users[id] } 

实际上你不需要排序,构建一个中间索引哈希,它是O(n):

 users_by_id = Hash[@users.map { |u| [u.id, u] }] users_by_id.values_at(*ids) 

如果您仍想尝试排序方法, Schwartzian变换就足够了:

 @users.sort_by { |u| ids.index(u.id) } 

但是,在循环中使用index是一个红色标记:O(n ^ 2)时间。 我们可以构建一个中间哈希来回到O(n * log n):

 indexes = Hash[ids.each_with_index.to_a] @users.sort_by { |u| indexes[u.id] } 

当然不需要去DB,因为你已经有了User对象,虽然由于用户在一个数组中,你可能想要创建一个id => User的临时地图来获得最终结果。

如果您可以通过调用user.id来访问每个用户的id,您可以像这样对数组进行排序:

 @users.sort!{|a,b| a.id <=> b.id } 

如果只将id与对象放在一个单独的数组中,则可以执行以下操作:将两个数组压缩在一起,对结果数组进行排序,然后从结果中收集已排序的用户。

 users_ids = @users.zip(ids) # creates an array of smaller arrays each holding [user, id] users_ids.sort!{|a,b| a[1] <=> b[1]} # sorts on the id in each sub-array sorted_users = users_ids.collect{|item| item[0]} #grabs the users, leaving the ids behind 

看一眼: http : //ariejan.net/2007/01/28/ruby-sort-an-array-of-objects-by-an-attribute