【问题标题】:Sorting array by more than one condition按多个条件对数组进行排序
【发布时间】:2015-08-23 22:07:14
【问题描述】:

我有一个点数组:

arr = [[2,0], [1,0], [2,1], [1,1]]

如何先按 x 降序和升序对元素进行排序,然后按相似 x 值的 y 值排序?

max = [[2,1], [2,0], [1,1], [1,0]]
min = [[1,0], [1,1], [2,0], [2,1]]

【问题讨论】:

    标签: arrays ruby sorting


    【解决方案1】:
    min = arr.sort
    # => [[1, 0], [1, 1], [2, 0], [2, 1]]
    max = min.reverse
    # => [[2, 1], [2, 0], [1, 1], [1, 0]]
    

    如果性能是一个问题而不是简单性,那么可以使用以下方法。

    min = arr.sort_by(&:itself)
    

    【讨论】:

    • Benchmarks 表明使用 reverse 进行排序比使用否定值更快,因此 +1。
    • 在 v2.2+ 中,您可以使用Array#max 获取maxarr.max(arr.size) #=> [[2, 1], [2, 0], [1, 1], [1, 0]]
    • @CarySwoveland 是否有任何文件保证订单?
    • 我也想知道这一点。虽然我什么都没看到,但我希望它会复制 sort.reverse。一个小实验:n=10**6; a = (0..n).to_a.reverse; puts a.shuffle.max(a.size) == a #=> trueminmin_bymax_by 类似。
    【解决方案2】:

    这是Enumerable#sort_by 的一个很好的用例。

    最大:

    arr.sort_by { |el| [-el[0], -el[1]] }
    => [[2, 1], [2, 0], [1, 1], [1, 0]]
    

    最小:

    arr.sort_by { |el| [el[0], el[1]] }
    => [[1, 0], [1, 1], [2, 0], [2, 1]]
    

    【讨论】:

      猜你喜欢
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      相关资源
      最近更新 更多