2013-07-24 5 views
5

Nehmen wir an, ich habe ein Array ary = [0.0, 1.0, 5.0, 1.0, -2.0, 3.5], und ich möchte als Ausgabe ein weiteres Array mit der gleichen Größe, die ary 's-Indizes in sortierter by-Wert-Reihenfolge. Mit anderen Worten, die Ausgabe sollte [4,0,1,3,5,2] sein. Gibt es einen effizienten Weg, dies mit Enumerable oder Array zu tun?Indizes für die sortierte Permutation eines Arrays in Ruby erhalten?

Die triviale Lösung, die ich vorstellen kann, ist wie folgt:.

class Array 
    def sorted_indices 
    self.map.with_index{ |v,i| [v,i] }.sort{ |a,b| a[0] <=> b[0] }.map { |v| v[1] } 
    end 
end 

aber ich fühle mich wie es in etwas einfacher bereits gebaut sein muss

Es ist wichtig, dass die Werte im Array beachten sind nicht einzigartig. Kein Index sollte mehr als einmal im Ergebnis-Array erscheinen (mit anderen Worten, [4,0,1,1,5,2] ist nicht korrekt).

Antwort

6
ary.each_index.sort_by{|i| ary[i]} 
# => [4, 0, 1, 3, 5, 2] 
+0

Das war schnell. Vielen Dank! –

+2

'to_a' kann entfernt werden. :) – Santhosh