3 Stimmen

Neuordnung eines Arrays in der gleichen Reihenfolge, in der ein anderes Array neu geordnet wurde

Ich habe zwei Arrays a , b der gleichen Länge:

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

Wenn ich sortiere a mit sort_by! die Elemente von a werden in einer anderen Reihenfolge angeordnet:

a.sort_by!{|a_i| some_condition(a_i)}

Wie kann ich nachbestellen? b in der gleichen Reihenfolge/Umordnung wie die Umordnung von a ? Zum Beispiel, wenn a nach sort_by! est

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

dann möchte ich

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

bearbeiten

Ich muss es an Ort und Stelle tun (d. h. die object_id von a , b ). Die beiden Antworten, die bisher gegeben wurden, sind insofern nützlich, als sie die sortierten Arrays angeben:

a_sorted
b_sorted

Ich kann

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

aber wenn möglich, möchte ich es direkt tun. Wenn nicht, werde ich eine der bereits gegebenen Antworten akzeptieren.

10voto

Paul Prestidge Punkte 1109

Ein Ansatz wäre, die beiden Arrays zusammenzuzippen und sie gleichzeitig zu sortieren. Vielleicht etwas wie dies?

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"]

3voto

the Tin Man Punkte 154584

Wie wäre es damit:

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"]

oder

ary_a.zip(ary_b).sort_by(&:first).map{ |a,b| b } # => ["b", "c", "a"]

2voto

Andrew Grimm Punkte 73882

Wenn die Einträge eindeutig sind, kann das Folgende funktionieren. Ich habe es nicht getestet. Dies ist teilweise kopiert von 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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X