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

Matthieu Raynaud de Fitte

我的数组看起来像这样:

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]]

如何做到尽可能优化?

卡里·斯沃夫兰(Cary Swoveland)

我的理解是,什么时候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#sortEnumerable#sort_by依赖于Array#<=>方法来确定要排序的每对数组的顺序。两个数组,ab在字典顺序,这意味着以下。如果a[0] < b[0]thena小于ba < b)或等效地,a <=> b #=> -1同样,如果a[0] > b[0]thena大于ba > b)和a <=> b #=> 1如果为a[0] == b[0],则通过以相同方式比较第二个元素来打断领带,依此类推。如果a小于ba.size < b.size),并且a.size每个数组的第一个元素相等,则a < bab相等,当且仅当a <=> b #=> 0

由于要放置在排序数组末尾的元素a,因此a[2] < 0我们需要按其第一个元素将数组放置在排序数组的前面或后面的数组进行排序。正是由于这个原因,当a[2] >= 0biggest_plus_1当时a[2] < 0我将sort-by数组的第一个元素设为零,其中biggest_plus_1,最大值是a[2]加1。

排序数组的其余元素确定如何对两组数组中的每一个进行排序。

请注意,biggest_plus_1如果all a[2] < 0则将为非正值,但这无关紧要,因为第一个元素为零的数组不会对任何元素进行排序。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何根据大小对数字数组列表进行排序?

来自分类Dev

用科学计数法对数字数组进行排序

来自分类Dev

在VBS中对数字数组进行排序

来自分类Dev

在Inno Setup中对数字数组进行排序

来自分类Dev

如何在C中对数字数组进行排序

来自分类Dev

根据数字数组对字符串数组进行排序

来自分类Dev

是否可以使用合并排序(C#)根据多个条件对数组进行排序?

来自分类Dev

无法根据包含的数字对数组进行排序

来自分类Dev

根据值中的数字对数组进行排序

来自分类Dev

根据条件对数组排序

来自分类Dev

根据多个条件对数组的项目重新排序

来自分类Dev

如何创建对数字数组进行排序并能够即时交换数组的函数?

来自分类Dev

如何创建对数字数组进行排序并能够即时交换数组的函数?

来自分类Dev

在 JavaScript 中对数字数组和对象数组进行排序

来自分类Dev

在PHP中使用多个条件对数组进行排序

来自分类Dev

Javascript-按多个条件对数组进行排序

来自分类Dev

如何找到在JavaScript中按降序对数字数组进行排序所需的最小交换次数

来自分类Dev

如何在JMeter Beanshell中对数字数组进行排序

来自分类Dev

使用算术运算符与比较运算符对数字数组进行排序

来自分类Dev

在数组对象内部对数字数组进行排序,同时保持其他数组的顺序与排序后的数字数组的顺序相同

来自分类Dev

根据数组内部数组中的EYE_SIZE对数组进行数字排序

来自分类Dev

根据另一个数组的顺序对数组数组进行排序(Ruby)

来自分类Dev

使用uasort尝试对数字数组进行排序并将所有字母值放在数组的末尾

来自分类Dev

PHP根据值对数组进行排序

来自分类Dev

根据特定元素对数组进行排序

来自分类Dev

如何根据TimeWise对数组进行排序?

来自分类Dev

PHP根据值对数组进行排序

来自分类Dev

如何根据参数对数组进行排序

来自分类Dev

根据值对数组进行排序

Related 相关文章

  1. 1

    如何根据大小对数字数组列表进行排序?

  2. 2

    用科学计数法对数字数组进行排序

  3. 3

    在VBS中对数字数组进行排序

  4. 4

    在Inno Setup中对数字数组进行排序

  5. 5

    如何在C中对数字数组进行排序

  6. 6

    根据数字数组对字符串数组进行排序

  7. 7

    是否可以使用合并排序(C#)根据多个条件对数组进行排序?

  8. 8

    无法根据包含的数字对数组进行排序

  9. 9

    根据值中的数字对数组进行排序

  10. 10

    根据条件对数组排序

  11. 11

    根据多个条件对数组的项目重新排序

  12. 12

    如何创建对数字数组进行排序并能够即时交换数组的函数?

  13. 13

    如何创建对数字数组进行排序并能够即时交换数组的函数?

  14. 14

    在 JavaScript 中对数字数组和对象数组进行排序

  15. 15

    在PHP中使用多个条件对数组进行排序

  16. 16

    Javascript-按多个条件对数组进行排序

  17. 17

    如何找到在JavaScript中按降序对数字数组进行排序所需的最小交换次数

  18. 18

    如何在JMeter Beanshell中对数字数组进行排序

  19. 19

    使用算术运算符与比较运算符对数字数组进行排序

  20. 20

    在数组对象内部对数字数组进行排序,同时保持其他数组的顺序与排序后的数字数组的顺序相同

  21. 21

    根据数组内部数组中的EYE_SIZE对数组进行数字排序

  22. 22

    根据另一个数组的顺序对数组数组进行排序(Ruby)

  23. 23

    使用uasort尝试对数字数组进行排序并将所有字母值放在数组的末尾

  24. 24

    PHP根据值对数组进行排序

  25. 25

    根据特定元素对数组进行排序

  26. 26

    如何根据TimeWise对数组进行排序?

  27. 27

    PHP根据值对数组进行排序

  28. 28

    如何根据参数对数组进行排序

  29. 29

    根据值对数组进行排序

热门标签

归档