我有一个看起来像这样的数组:
a = [[0,1], [1,2], [2,3]]
和这样的数组b
:
b = [5, 3, 4]
中的元素b
对应于a
同一索引中的元素。我想对b
元素进行排序a
,同时以与b
.
所以对于上面的例子,我会得到:
a = [[1, 2], [2, 3], [0, 1]] and b = [3, 4, 5]
我怎样才能做到这一点?
我有一个看起来像这样的数组:
a = [[0,1], [1,2], [2,3]]
和这样的数组b
:
b = [5, 3, 4]
中的元素b
对应于a
同一索引中的元素。我想对b
元素进行排序a
,同时以与b
.
所以对于上面的例子,我会得到:
a = [[1, 2], [2, 3], [0, 1]] and b = [3, 4, 5]
我怎样才能做到这一点?
a = [[0,1], [1,2], [2,3]]
b = [5, 3, 4]
a, b = b.zip(a).sort.transpose
p b #=> [[1, 2], [2, 3], [0, 1]]
要了解它是如何工作的,只需查看 ; 的结果即可p b.zip(a)
。然后p b.zip(a).transpose
。
这是显示输出和执行时间的快速基准:
require 'benchmark'
require 'pp'
a = [[0,1], [1,2], [2,3]]
b = [5, 3, 4]
pp a.sort_by.with_index{|_,i| b[i]}
a,b = b.zip(a).sort.transpose
pp b
a = [[0,1], [1,2], [2,3]]
b = [5, 3, 4]
n = 1_000_000
puts "Using #{n} iterations:"
Benchmark.bm(7) do |bench|
bench.report('sort_by') { n.times { a.sort_by.with_index{|_,i| b[i]} } }
bench.report('zip') { n.times { b.zip(a).sort.transpose } }
end
这是输出:
[[1, 2], [2, 3], [0, 1]]
[[1, 2], [2, 3], [0, 1]]
Using 1000000 iterations:
user system total real
sort_by 2.370000 0.000000 2.370000 ( 2.371345)
zip 2.730000 0.000000 2.730000 ( 2.730663)
即使@steenslag 提供了一个很好的解决方案,我仍然不建议使用zip
它的低性能,特别是如果数组很大,因为它会生成一个中间数组。
以下代码更直接:
a = [[0,1], [1,2], [2,3]]
b = [5, 3, 4]
p a.sort_by.with_index{|_,i| b[i]}
输出:
[[1, 2], [2, 3], [0, 1]]