0

我有一组从数据库中提取的对象。但是我只能从数据库中按升序或降序对它们进行排序,但是我需要它们以自定义顺序。

假设我有一个来自 db 的对象数组:

arr =  [obj1,obj2,obj3]

在哪里obj1 has id 1, obj2 has id 2 and obj3 has id 3

但我的排序顺序是3,1,2或者我会有一些 id 数组来决定顺序,即[3,1,2]

所以自定义排序的顺序是:

arr =  [obj3,obj1,obj2]

我试过了 :

arr.sort_by{|a,b| [3,1,2]}

我一直在阅读一些关于排序的教程和链接,它主要是简单的排序。那么如何实现上述自定义排序呢?

4

2 回答 2

4

你很近。[3,1,2]指定排序,但它不会告诉块如何将其与您的对象相关联。你想要这样的东西:

arr.sort_by {|obj| [3,1,2].index(obj.id) }

因此,比较将按对象在数组中的位置顺序排列您的对象id

或者,使用更明确的sort(您似乎对此sort_by有些困惑):

arr.sort do |a,b|
  ordering = [3,1,2]
  ordering.index(a.id) <=> ordering.index(b.id)
end
于 2013-08-01T23:02:17.093 回答
2

这就像@Chuck 的答案,但有O(n log n)性能。

# the fixed ordering
ordering = [3, 1, 2]

# a map from the object to its position in the ordering
ordering_index = Hash[ordering.map(&:id).each_with_index.to_a]

# a fast version of the block
arr.sort_by{|obj| ordering_index[obj.id]}
于 2013-08-02T00:49:14.550 回答