【问题标题】:Sort an enumerable in descending order按降序对枚举进行排序
【发布时间】:2011-01-09 16:41:36
【问题描述】:

按降序对Enumerable 进行排序的最佳方法是什么?

我一直在做@array.sort.reverse 或@array.sort_by{|song| song.title }.reverse

我想我可以做类似@array.sort{|a, b| b.title <=> a.title} 的事情,但我觉得这很难阅读而且冗长。

【问题讨论】:

  • 我觉得array.sort.reverse 不错。简单明了,应该不会很贵。
  • 你为什么不使用#reverse?
  • 由于 sort 是 O(n log n) 而 reverse 只是 O(n),所以 Peter 的解决方案很好。

标签: ruby enumerable


【解决方案1】:

我不确定这是否比 Wayne Conrad 自我描述的“明显的垃圾”更好,但您可以将 Enumerable#sort_by_descending 定义为

Enumerable.class_eval do
  def sort_by_descending(&block)
    sort { |a, b| block.bind(b).call <=> block.bind(a).call }
  end
end

然后调用如下:

@songs.sort_by_descending(&:title)

【讨论】:

    【解决方案2】:

    Array.reverse 的性能还不错。非常。使用@array.sort.reverse 的成本是额外的数组重复加上反向(n/2 元素切换)。所以是的,如果你认为它读起来更清楚,我认为这应该是可以接受的。

    有关详细信息,请参阅其source。而且,我认为使用@array.sort.reverse 确实提供了“稍微”更好的可读性(但它并不是很难以任何方式阅读)。

    【讨论】:

    • sort.reverse 并不比 sort 慢多少,而且比任何花哨的东西都快。我在 1,000,000 个随机浮点数上对 array.sort、array.sort.reverse 和 array.reverse_sort(我的猴子补丁解决方案,我已经将其删除为“明显的垃圾”)进行了基准测试,得到了 2.4、2.5 和分别为 24.8 秒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 2015-05-02
    • 2020-07-20
    • 2016-07-01
    • 1970-01-01
    相关资源
    最近更新 更多