次のような配列があります。
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]]