Изменение порядка массива в том же порядке, что и другой массив - PullRequest
3 голосов
/ 20 января 2012

У меня есть два массива a, b одинаковой длины:

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

Когда я сортирую a, используя sort_by!, элементы a будут расположены по-разномуorder:

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]

Изменить

Мне нужно сделатьэто на месте (то есть, сохраните object_id a, b).Два ответа, приведенные до сих пор, полезны в этом, учитывая отсортированные массивы:

a_sorted
b_sorted

Я могу сделать

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

, но если возможно, я хочу сделать это напрямую.Если нет, я приму один из ответов, которые уже даны.

Ответы [ 3 ]

10 голосов
/ 20 января 2012

Один из подходов - объединить два массива и отсортировать их одновременно Может быть, как-то так?

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"]
3 голосов
/ 20 января 2012

Как насчет:

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 голосов
/ 20 января 2012

Если записи уникальны, может работать следующее. Я не проверял это. Это частично скопировано из 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
...