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?例如,如果aaftersort_by!

[a_3, a_6, a_1, ..., a_i_n]

那我想要

[b_3, b_6, b_1, ..., b_i_n]

编辑

我需要就地执行(即保留 , 的 object_id ab。鉴于已排序的数组,到目前为止给出的两个答案很有用:

a_sorted
b_sorted

我可以

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

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

4

3 回答 3

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"]
于 2012-01-19T23:41:01.360 回答
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"]
于 2012-01-19T23:41:34.170 回答
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
于 2012-01-20T00:15:50.890 回答