Jak posortować tablicę skrótów według wartości w skrócie?

120

Ten kod Ruby nie zachowuje się tak, jak bym się spodziewał:

# create an array of hashes
sort_me = []
sort_me.push({"value"=>1, "name"=>"a"})
sort_me.push({"value"=>3, "name"=>"c"})
sort_me.push({"value"=>2, "name"=>"b"})

# sort
sort_me.sort_by { |k| k["value"]}

# same order as above!
puts sort_me

Chcę posortować tablicę skrótów według klucza „wartość”, ale są one drukowane bez sortowania.

Ollie Glass
źródło

Odpowiedzi:

215

Ruby sortnie sortuje na miejscu. (Czy masz może tło w Pythonie?)

Ruby sort!umożliwia sortowanie na miejscu, ale sort_byw Ruby 1.8 nie ma takiego wariantu . W praktyce możesz:

sorted = sort_me.sort_by { |k| k["value"] }
puts sorted

Od wersji Ruby 1.9+ .sort_by!jest dostępne do sortowania na miejscu:

sort_me.sort_by! { |k| k["value"]}
Stéphan Kochen
źródło
28
Właściwie Array#sort_by!jest nowy w Rubim 1.9.2. Dostępne dzisiaj dla wszystkich wersji Ruby, wymagając również mojego backportsklejnotu :-)
Marc-André Lafortune
Cześć, czy istnieje również sposób sortowania w porządku malejącym? Myślę, że mógłbym chcieć iść 3,2,1...
tekknolagi
2
Nie możesz tego zrobić za pomocą sort_by, ale użyj sortlub sort!i po prostu odwróć operandy: a.sort! {|x,y| y <=> x }( ruby-doc.org/core-1.9.3/Array.html#method-i-sort )
Stéphan Kochen
1
Lub:puts sorted = sort_me.sort_by{ |k,v| v }
Zaz,
9
@tekknolagi: Po prostu dołącz .reverse.
Zaz
21

Jak w @shteef, ale zaimplementowano z sort!wariantem zgodnie z sugestią:

sort_me.sort! { |x, y| x["value"] <=> y["value"] }
bjg
źródło
7

Chociaż Ruby nie ma sort_bywariantu w miejscu, możesz:

sort_me = sort_me.sort_by { |k| k["value"] }

Array.sort_by! został dodany w 1.9.2

AG_
źródło
1
Ta odpowiedź „Array.sort_by! Została dodana w 1.9.2” działała dla mnie
web spider26
2

Możesz użyć sort_me.sort_by!{ |k| k["value"]}. To powinno działać.

Mukesh Kumar Gupta
źródło