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

dgi*_*rez 9 ruby sorting ruby-on-rails

我有一组对象@users,每个对象都有自己的id属性.

@users = [#<User id:1>, #<User id:2>]
Run Code Online (Sandbox Code Playgroud)

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

ids = [2,1]
Run Code Online (Sandbox Code Playgroud)

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

谢谢 !!!

tok*_*and 20

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

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

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

@users.sort_by { |u| ids.index(u.id) }
Run Code Online (Sandbox Code Playgroud)

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

indexes = Hash[ids.each_with_index.to_a]
@users.sort_by { |u| indexes[u.id] }
Run Code Online (Sandbox Code Playgroud)

  • 引用schwartzian变换的+1;) (2认同)

pea*_*kxu 11

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

ids_users = {}

@users.each {|user| ids_users[user.id] = user}
Run Code Online (Sandbox Code Playgroud)

然后,使用id命令

ids.collect{ |id| ids_users[id] }
Run Code Online (Sandbox Code Playgroud)