2

重複の可能性:
Ruby: 2 つの配列をそのうちの 1 つの値を使用して並べ替える

次のような配列があります。

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 に答える