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)
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)