Ruby-按第一行对多维数组进行排序

时间:2019-02-06 15:07:26

标签: arrays ruby sorting multidimensional-array

我需要按第一行对多维数组进行排序。 第一行(从array [0] [0]到array [0] [n-1])由字符串组成,我需要对其进行排序,其他各行则进行后续处理...

我已经进行了很多搜索,看到了如何使用sort函数按列对它进行排序,但是没有找到如何将其应用于我的问题...
我已经用冒泡排序解决了我的问题,他们对第一行进行排序,如果有更改,则将更改报告给其他行,但是我想知道是否有更好的方法吗?

创建数组: array = Array.new(4) { Array.new(var, 0) }

我里面有这样的东西:

[ [ "A 1", "A 3", "A 2", "A 4" ],
[ 4, 5, 6, 7 ],
[ 2, 2, 2, 2 ],
[ 0.1, 0.2, 0.1, 0.2 ] ]

预期结果如下:

[ [ "A 1", "A 2", "A 3", "A 4" ],
[ 4, 6, 5, 7 ],
[ 2, 2, 2, 2 ],
[ 0.1, 0.1, 0.2, 0.2 ] ]

2 个答案:

答案 0 :(得分:2)

您可以使用Array#transposeEnumerable#sort_by这样处理:

 arr = [ [ "A 1", "A 3", "A 2", "A 4" ],
         [ 4, 5, 6, 7 ],
         [ 2, 2, 2, 2 ],
         [ 0.1, 0.2, 0.1, 0.2 ] ]

Array#transpose将行变成列:

arr.transpose
#=> [["A 1", 4, 2, 0.1],
#    ["A 3", 5, 2, 0.2],
#    ["A 2", 6, 2, 0.1],
#    ["A 4", 7, 2, 0.2]]

然后,我们只需要按第一列值sort_by(&:first)进行排序:

arr.transpose.sort_by(&:first)
#=> [["A 1", 4, 2, 0.1],
#    ["A 2", 6, 2, 0.1],
#    ["A 3", 5, 2, 0.2],
#    ["A 4", 7, 2, 0.2]]

然后我们再次transpose回来:

arr.transpose.sort_by(&:first).transpose
#=> [["A 1", "A 2", "A 3", "A 4"],
#    [4, 6, 5, 7],
#    [2, 2, 2, 2],
#    [0.1, 0.1, 0.2, 0.2]]

可以通过将Array压缩在一起来达到相同的目的:(但是前者似乎是一个更好的选择)

arr.reduce(&:zip).sort_by {|a| a.flatten!.first}.transpose
#=> [["A 1", "A 2", "A 3", "A 4"],
#    [4, 6, 5, 7],
#    [2, 2, 2, 2],
#    [0.1, 0.1, 0.2, 0.2]]

答案 1 :(得分:0)

少用Ruby的方法:

sorted = arr.first.sort
# => ["A 1", "A 2", "A 3", "A 4"] 
order_arr = arr.first.map { |x| sorted.index(x) }
#  => [0, 2, 1, 3]
arr.map { |a| order_arr.map { |x| a[x] } }
# => [["A 1", "A 2", "A 3", "A 4"],
#     [4, 6, 5, 7],
#     [2, 2, 2, 2],
#     [0.1, 0.1, 0.2, 0.2]]