Ruby中sort_by两次排序。

13

Ruby在Enumerable上有一个sort_by方法。太棒了!这样你就可以像这样做:

entries.sort_by { |l| l.project.name }

这将按其项目名称对一堆条目进行排序。如何使在具有相同名称的项目内,条目按其时间排序?

3个回答

26

我建议将想要排序的列放入一个数组中。

entries.sort_by { |l| [l.project.name, l.project.time] }
这将尊重每种类型的自然排序顺序。

如果你想要第二排序为最近的排在前面,可以这样做:now = Time.now; entries.sort_by { |e| e.project.name, now - e.project.time } - James A. Rosen
5
按照项目名称和时间倒序排序条目更合理。 - Antti Tarvainen
不错,安蒂,真不错! - James A. Rosen
具体来说,第一个元素具有最高的优先级,而下一个元素则决定了平局。 - mgold

6
您可以使用常规的排序方法来实现它。
entries.sort do |a, b|
  comp = a.project.name <=> b.project.name
  comp.zero? ? (a.project.time <=> b.project.time) : comp
end

3
非零方法在这里可能会有帮助:sort {|a,b| (a.project.name <=> b.project.name).nonzero? or (a.project.time <=> b.project.time)} - glenn jackman

3

返回一个数组:

entries.sort_by { |l| [ l.project.name, l.project.time] }

这是因为数组上的<=>运算符执行逐个字段的“词法”比较,这正是您所需的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接