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

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 に答える