我有两个数组:
a = [6, 4, 3]
b = [1, 3, 4]
我致电a.sort
:
a.sort = [3, 4, 6]
如何对数组b
进行排序,以使值在排序前与数组a
中的值具有相同的位置?
现在就是:
b = [4, 3, 1]
因此b
中的值与数组a
中的值具有相同的位置。
答案 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