6

私は通常次のようなことをします

array.sort{|a,b| a.something <=> b.something}

これをどのように乾かす必要がありますか?

4

4 に答える 4

20

sort_byを使用します

array.sort_by{|e| e.something}

また

sort_lambda = lambda{|e| e.something}
array.sort_by(&sort_lambda)

後者を使用すると、sort_lambdaを他のsort_byステートメントで再利用できます

于 2009-09-16T14:39:53.007 に答える
5

Railsでは、あるいはActiveSupportで、またはRuby 1.9(おそらく1.8.7、わからない)では、新しいショートカットのホットネスを使用できます。

array.sort_by(&:something)

sort_byおそらく高価な(そしておそらく有益な:ソートキーの複雑さに依存する)副作用があることに注意してください:新しいキーでソートできるように、各アイテムの一時的なキーと値のペアを生成して保存します。詳細については、ドキュメントの説明を参照してください。

于 2009-09-16T15:17:05.057 に答える
5

Eimantasの両方の提案に+1しますが、先頭の句読点や/ a / anを無視して、大文字と小文字を区別せずに並べ替えるアルバムのように、常にこのように並べ替えるカスタムクラスがある場合によく発生します。そのためには、ソート値を1回計算してから、それに応じて<=>を再定義する方が効率的です。例えば:

class Album
 def sort_value
    @sv ||= @name.downcase.sub(/^\W*(the|an|a) /,"")
  end

  def <=>(other)
    sort_value <=> (other.sort_value rescue other)
  end
end
于 2009-09-16T15:29:58.090 に答える
0

aとbのクラスにComparableを含めて、sortを呼び出すことを検討しましたか?

于 2009-09-16T22:01:16.540 に答える