当前位置 : 主页 > 编程语言 > ruby >

Ruby根据多个条件对数字数组进行排序

来源:互联网 收集:自由互联 发布时间:2021-06-23
我的数组看起来像这样: 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]] 我想基于它们的第二个和第
我的数组看起来像这样:

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]< 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]则a小于b(a . b#=> -1.类似地,如果a [0]> b [0]则a大于b(a> b)且a =< => b#=> 1.如果[0] == b [0],则通过以相同方式比较第二个元素来打破平局,依此类推.如果a小于b(a.size< b.size),并且每个阵列的第一个a.size元素相等,则a <1.湾当且仅当< =>时,a和b相等. b#=> 0.

由于a [2]< 0应放在排序数组的末尾,我们需要按数组排序,这些数组的第一个元素将数组放在排序数组的前面或后面.出于这个原因,当a [2]> = 0时,我将sort-by数组的第一个元素设为零,而当a [2]< 0,其中largest_plus_1是a [2]的最大值加1. sort-by数组的其余元素确定如何对两组数组中的每一组进行排序. 请注意,如果所有a [2] <1,则maximum_plus_1将为非正数. 0,但这没关系,因为没有元素将被第一个元素为零的数组排序.

网友评论