我有两个长度相同的数组a
,b
:
a = [a_1, a_2, ..., a_n]
b = [b_1, b_2, ..., b_n]
当我使用a
对sort_by!
进行排序时,a
的元素将按不同的顺序排列:
a.sort_by!{|a_i| some_condition(a_i)}
如何按照与b
重新排序相同的顺序/重新排列重新排序a
?例如,如果a
之后的sort_by!
是
[a_3, a_6, a_1, ..., a_i_n]
然后我想要
[b_3, b_6, b_1, ..., b_i_n]
修改
我需要在适当的位置(即保留a
,b
的object_id)。鉴于已排序的数组,到目前为止给出的两个答案是有用的:
a_sorted
b_sorted
我能做到
a.replace(a_sorted)
b.replace(b_sorted)
但如果可能的话,我想直接这样做。如果没有,我会接受已经给出的答案之一。
答案 0 :(得分:10)
一种方法是将两个阵列压缩在一起并同时对它们进行排序。也许是这样的事情?
a = [1, 2, 3, 4, 5]
b = %w(a b c d e)
a,b = a.zip(b).sort_by { rand }.transpose
p a #=> [3, 5, 2, 4, 1]
p b #=> ["c", "e", "b", "d", "a"]
答案 1 :(得分:3)
怎么样:
ary_a = [ 3, 1, 2] # => [3, 1, 2]
ary_b = [ 'a', 'b', 'c'] # => ["a", "b", "c"]
ary_a.zip(ary_b).sort{ |a,b| a.first <=> b.first }.map{ |a,b| b } # => ["b", "c", "a"]
或
ary_a.zip(ary_b).sort_by(&:first).map{ |a,b| b } # => ["b", "c", "a"]
答案 2 :(得分:2)
如果条目是唯一的,则以下内容可能有效。我没有测试过。这部分是从https://stackoverflow.com/a/4283318/38765
复制而来的temporary_copy = a.sort_by{|a_i| some_condition(a_i)}
new_indexes = a.map {|a_i| temporary_copy.index(a_i)}
a.each_with_index.sort_by! do |element, i|
new_indexes[i]
end
b.each_with_index.sort_by! do |element, i|
new_indexes[i]
end