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_by 语句中重用 sort_lambda

于 2009-09-16T14:39:53.007 回答
5

对 Eimantas 的两个建议 +1,但我经常在我有一个总是以这种方式排序的自定义类的情况下出现这个问题,比如应该不区分大小写排序的专辑,忽略前导标点符号和 /a/an。对于这种用途,计算排序值一次会更有效,然后相应地重新定义 <=> 。例如:

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 回答
5

在 Rails 中,或者更确切地说是 ActiveSupport,或者在 Ruby 1.9(可能是 1.8.7,不确定)中,您可以使用新的快捷方式:

array.sort_by(&:something)

请注意,这sort_by可能具有昂贵的(并且可能是有益的:它取决于排序键的复杂性)的副作用:它为每个项目生成并存储一个临时键值对,以便它可以按您的新键排序。有关更多信息,请参阅文档中的讨论。

于 2009-09-16T15:17:05.057 回答
0

您是否考虑过在 a 和 b 的类中包含 Comparable,然后只调用 sort?

于 2009-09-16T22:01:16.540 回答