当前位置: 首页 > 知识库问答 >
问题:

Ruby基于多个条件对数字数组进行排序

柴意智
2023-03-14

我的数组如下所示:

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

怎么做才能尽可能的优化呢?

共有3个答案

欧阳成弘
2023-03-14
匿名用户

我对你的问题的变体是:

to_sort.sort_by { |a| a[1].abs; a[2] < 0 ? a[2].abs+1 : a[2] }
#=>[[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]]

此外,我们可以只使用<code>。abs,它看起来像:

to_sort.sort_by { |a| a[1].abs; a[2].abs } 

但是这样< code>-2 == 2返回true,结果将是这样的:

#=> [[6, 27, 1, 11.0], [7, 27, 1, 12.0], [8, 27, 1, 13.0], [2, 27, -2, 2.0],
# [3, 27, -2, 3.0], [4, 27, -2, 4.0], [5, 27, -2, 5.0], [9, 27, 2, 14.0],
# [1, 27, -3, 1.0]]

洪开诚
2023-03-14

我的理解是,当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]] 

数组#sort和可枚举#sort_by依赖于方法Array#

由于元素 a [2]

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

请注意,如果所有a[2],biggest_plus_1将为非正

郑晗日
2023-03-14

这是一个三步走的方法,尽管我相信还有另一个更简洁的答案。

首先,我们对第 3 个元素为正和/或零的值进行排序:

pos = to_sort.select { |arr| arr[2] >= 0 }.sort_by { |arr| [arr[2], arr[3]] }
=> [[6, 27, 1, 11.0], [7, 27, 1, 12.0], [8, 27, 1, 13.0], [9, 27, 2, 14.0]]

然后我们对第三个元素为负的值进行排序:

neg = to_sort.select { |arr| arr[2] < 0 }.sort_by { |arr| [-arr[2], arr[3]] }

然后我们将它们结合在一起:

pos + neg
=> [[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]]
 类似资料:
  • 问题内容: 我有一个对象数组: 联系人类别: 而且我想通过该数组进行排序,然后在某些情况下接触得到了相同的。 我可以按其中一个条件进行排序,但不能同时按两个条件进行排序。 我如何添加更多条件来对该数组进行排序? 问题答案: 想一想“按多个标准排序”是什么意思。这意味着首先通过一个条件比较两个对象。然后,如果这些条件相同,则领带将被下一个条件破坏,依此类推,直到获得所需的排序。 您在这里看到的是me

  • 问题内容: 我有这样的txt文件中的数据列表 我的任务是按照每个标准对这些数据进行排序,例如)按日期,纬度和经度排序 我尝试像这样的泡沫排序 这可行,但是需要太多时间 那里有在txt文件数据 有没有其他方法可以对这些数据进行排序? 问题答案: 我可能会破坏一些学生的家庭作业,但是这里… 正如课题所建议的那样,Java的自然方法是创建一个表示您的数据的类。然后实现一个将传递给实用方法的方法。 在运行

  • 问题内容: 在PHP中可以做这样的事情吗?您将如何编写函数?这是一个例子。顺序是最重要的。 我想做类似的事情 因为最后我使用了foreach()并且它们的顺序不正确(因为我将值附加到需要正确顺序的字符串中,而且我事先也不知道所有的数组键/值)。 我看过PHP的内部数组函数,但似乎只能按字母或数字排序。 问题答案: 只需使用或即可。通过以给定的数组(按正确的顺序)开始并用实际数组中的数据覆盖/添加键

  • 这看起来很容易,但却不知道该怎么做。当前数组数据是按日期和日期列出的,因此我需要将所有日期组合起来:天、月、6个月、1年。我需要将数组数据排列为下面的第二个数组。

  • 我想根据另一个数组(索引)的排序顺序迭代两个数组(A,B),在本例中是10、34、32、21。 为这里的坏例子道歉。我已经更新了索引数组以消除混乱。 预期投入产出 但是,如果我将最后一行末尾的indexes[s]更改为indexes[indexOrder.indexOf(s)]。排序将给出错误的结果。如果ArrayList的索引与其值相同,为什么indexOf(s)会给出与s不同的结果。

  • 问题内容: 我试图通过多个键对多维数组进行排序,但我不知道从哪里开始。我看了uasort,但不确定如何根据需要编写函数。 我需要按状态排序,然后按event_type排序,然后按日期排序。 我的数组如下所示: 问题答案: 你需要 从PHP 5.5.0开始: 就是现在: