我需要按第一行对多维数组进行排序。 第一行(从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 ] ]
答案 0 :(得分:2)
您可以使用Array#transpose
和Enumerable#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]]