重新排序以与另一个数组相同的顺序重新排序数组

时间:2012-01-19 23:32:06

标签: ruby arrays algorithm sorting ruby-1.9.3

我有两个长度相同的数组ab

a = [a_1, a_2, ..., a_n]
b = [b_1, b_2, ..., b_n]

当我使用asort_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]

修改

我需要在适当的位置(即保留ab的object_id)。鉴于已排序的数组,到目前为止给出的两个答案是有用的:

a_sorted
b_sorted

我能做到

a.replace(a_sorted)
b.replace(b_sorted)

但如果可能的话,我想直接这样做。如果没有,我会接受已经给出的答案之一。

3 个答案:

答案 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