Bir karma dizisini karmadaki bir değere göre nasıl sıralayabilirim?


121

Bu Ruby kodu beklediğim gibi davranmıyor:

# 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

Karma dizisini "değer" anahtarına göre sıralamak istiyorum, ancak sıralanmamış olarak yazdırılıyorlar.

Yanıtlar:


216

Ruby sortyerinde sıralama yapmaz. (Belki bir Python geçmişiniz var mı?)

Ruby'nin sort!yerinde sıralama için vardır, ancak sort_byRuby 1.8'de bunun yerinde bir varyantı yoktur . Pratikte şunları yapabilirsiniz:

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

Ruby 1.9+ itibariyle, .sort_by!yerinde sıralama için mevcuttur:

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

28
Aslında Array#sort_by!Ruby 1.9.2'de yenidir. Benim backports
cevherimi

Merhaba, azalan sırayla da sıralamanın bir yolu var mı? Sanırım gitmek isteyebilirim 3,2,1...
tekknolagi

2
Bunu ile yapamazsınız sort_by, ancak işlenenleri kullanın sortveya sort!basitçe çevirin: a.sort! {|x,y| y <=> x }( ruby-doc.org/core-1.9.3/Array.html#method-i-sort )
Stéphan Kochen

1
Veya:puts sorted = sort_me.sort_by{ |k,v| v }
Zaz

9
@tekknolagi: Sadece ekleyin .reverse.
Zaz

21

@Shteef'e göre, ancak sort!önerilen varyantla uygulandı :

sort_me.sort! { |x, y| x["value"] <=> y["value"] }

7

Ruby'nin sort_byyerinde bir varyantı olmasa da şunları yapabilirsiniz:

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

Array.sort_by! 1.9.2'de eklendi


1
Bu "Array.sort_by!
1.9.2'de

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.