我的数组看起来像这样:
to_sort = [[1, 27, -3, 1.0], [2, 27, -2, 2.0], [3, 27, -2, 3.0], [4, 27, -2, 4.0],
[5, 27, -2, 5.0], [6, 27, 1, 11.0], [7, 27, 1, 12.0], [8, 27, 1, 13.0],
[9, 27, 2, 14.0]]
我想根据它们的第二个和第三个值以升序对这些数组进行排序,但是对于第三个数具有负数的数组,必须递减排序并放在其他数组之后。
结果应该是这样的:
sorted = [[6, 27, 1, 11.0], [7, 27, 1, 12.0], [8, 27, 1, 13.0], [9, 27, 2, 14.0],
[2, 27, -2, 2.0], [3, 27, -2, 3.0], [4, 27, -2, 4.0], [5, 27, -2, 5.0],
[1, 27, -3, 1.0]]
如何做到尽可能优化?
我的理解是,什么时候a[2] >= 0
对数组进行排序,而要排序的[a[1], a[2]]
元素a[2] < 0
在排序数组的末尾并由排序[-a[1], -a[2]]
。
biggest_plus_1 = to_sort.map { |a| a[2] }.max + 1
#=> 3
to_sort.sort_by { |a| a[2] >= 0 ? [0, a[1], a[2]] : [biggest_plus_1, -a[1], -a[2]] }
#=> [[6, 27, 1, 11.0], [7, 27, 1, 12.0], [8, 27, 1, 13.0], [9, 27, 2, 14.0],
# [5, 27, -2, 5.0], [2, 27, -2, 2.0], [3, 27, -2, 3.0], [4, 27, -2, 4.0],
# [1, 27, -3, 1.0]]
Array#sort和Enumerable#sort_by依赖于Array#<=>方法来确定要排序的每对数组的顺序。两个数组,a
并b
在字典顺序,这意味着以下。如果a[0] < b[0]
thena
小于b
(a < b
)或等效地,a <=> b #=> -1
。同样,如果a[0] > b[0]
thena
大于b
(a > b
)和a <=> b #=> 1
。如果为a[0] == b[0]
,则通过以相同方式比较第二个元素来打断领带,依此类推。如果a
小于b
(a.size < b.size
),并且a.size
每个数组的第一个元素相等,则a < b
。a
和b
相等,当且仅当a <=> b #=> 0
。
由于要放置在排序数组末尾的元素a
,因此a[2] < 0
我们需要按其第一个元素将数组放置在排序数组的前面或后面的数组进行排序。正是由于这个原因,当a[2] >= 0
且biggest_plus_1
当时a[2] < 0
,我将sort-by数组的第一个元素设为零,其中biggest_plus_1
,最大值是a[2]
加1。
排序数组的其余元素确定如何对两组数组中的每一个进行排序。
请注意,biggest_plus_1
如果all a[2] < 0
,则将为非正值,但这无关紧要,因为第一个元素为零的数组不会对任何元素进行排序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句