【发布时间】: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]]
。
【问题讨论】:
我有一个点数组:
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]]
。
【问题讨论】:
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)
【讨论】:
reverse 进行排序比使用否定值更快,因此 +1。
max:arr.max(arr.size) #=> [[2, 1], [2, 0], [1, 1], [1, 0]]
sort.reverse。一个小实验:n=10**6; a = (0..n).to_a.reverse; puts a.shuffle.max(a.size) == a #=> true。 min、min_by 和 max_by 类似。
这是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]]
【讨论】: