如何以相同的方式对两个数组进行排序?

时间:2011-12-27 19:38:24

标签: ruby-on-rails ruby ruby-on-rails-3

我有两个数组:

a = [6, 4, 3]
b = [1, 3, 4]

我致电a.sort

a.sort = [3, 4, 6]

如何对数组b进行排序,以使值在排序前与数组a中的值具有相同的位置?

现在就是:

b = [4, 3, 1]

因此b中的值与数组a中的值具有相同的位置。

4 个答案:

答案 0 :(得分:12)

您可以使用zip方法将两个数组合并为一个。一旦你结合a和b,你就会得到,

[[6, 1], [4, 3], [3, 4]]

现在对数组进行排序,这将根据每个子数组的第一个元素对它们进行排序,

[[3, 4], [4, 3], [6, 1]]

现在我们想要执行zip的反向,以将每个子数组的第一个和第二个元素转换为新数组。使用transpose,我们可以将其恢复为原始格式,

[[3, 4, 6], [4, 3, 1]]

谢天谢地,使用并行分配所有这一切都可以在一行中完成。这是完整的代码,

x, y = a.zip(b).sort.transpose

现在x应包含[3, 4, 6]y应包含[4, 3, 1]

答案 1 :(得分:2)

a = [6, 4, 3]
b = [1, 3, 4]

ra, rb = a.zip(b).sort_by(&:first).transpose
# ra => [3, 4, 6]
# rb => [4, 3, 1]

答案 2 :(得分:0)

我不知道你想要实现什么,我相信其他人可以提出更优雅的解决方案,但我会使用Hash代替。将a的值指定为键,将b的值指定为值。您可以迭代a来完成此任务,或者在您创建此数据时提前完成。结果应该是:

$ hash
=> {6 => 1, 4 => 3, 3 => 4}
    a0   b0 a1   b1 a2   b2
$ hash.sort
=> [[3, 4], [4, 3], [6, 1]]

就像我说的那样,不是非常顺利,但我有火鸡宿醉...

答案 3 :(得分:0)

[a, b].transpose.sort { |x, y| x[0] <=> y[0] }.transpose[1]
=> [4, 3, 1]

a, b = [a, b].transpose.sort { |x, y| x[0] <=> y[0] }.transpose