2

可能重复:
Ruby:使用其中一个数组的值对 2 个数组进行排序

我有一个看起来像这样的数组:

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]

我怎样才能做到这一点?

4

3 回答 3

3
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

于 2012-10-02T15:13:22.453 回答
1

这是显示输出和执行时间的快速基准:

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)
于 2012-10-02T16:52:13.360 回答
0

即使@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]]
于 2012-10-02T15:48:30.567 回答