Ruby Karma değerini sayı değerine göre nasıl sıralayabilirim?


154

Saymaya göre sıralamaya çalıştığım bir karşı karma var. Ben çalışıyorum sorun varsayılan Hash.sort işlevi sayı boyutu yerine, dizeleri gibi sayıları sıralar olmasıdır.

yani Verilen Hash:

metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 10 }

Bu kodu çalıştırma:

metrics.sort {|a1,a2| a2[1]<=>a1[1]}

sıralı bir dizi döndürür:

[ 'siteb.com', 9, 'sitea.com', 745, 'sitec.com', 10]

745, 9'dan daha büyük bir sayı olmasına rağmen, listede ilk olarak 9 belirecektir. En çok kimin sayıldığını göstermeye çalışırken, bu hayatımı zorlaştırıyor. :)

Bir karma değerini (veya bir diziyi bile) sayı değeri boyutuna göre nasıl sıralayacağınız konusunda herhangi bir fikriniz var mı?

Herhangi bir yardım için teşekkür ederim.


hangi yakut versiyonunu kullanıyorsun sıralama sonucunuz çok garip
fl00r

Yanıtlar:


268

Sonuçlarınızı nasıl aldığınız hakkında hiçbir fikriniz yok, çünkü dize değerine göre sıralamayacaktır ... Tersine a1ve a2örneğinizde

Her durumda (Mladen'e göre) en iyi yol:

metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 10 }
metrics.sort_by {|_key, value| value}
  # ==> [["siteb.com", 9], ["sitec.com", 10], ["sitea.com", 745]]

Sonuç olarak bir karmaya ihtiyacınız varsa kullanabilirsiniz to_h(Ruby 2.0+)

metrics.sort_by {|_key, value| value}.to_h
  # ==> {"siteb.com" => 9, "sitec.com" => 10, "sitea.com", 745}

84
or simplysort_by{|k,v| v}
Mladen Jablanović

Numaram bir dize olarak dönüyordu, bu sabit .. Ben o sırada a2 ve a1 vardı çünkü sonuçları azalan sıralama istedim .. geri bildiriminiz için teşekkürler olsa.
Dustin

Bu yüzden Ruby'yi seviyorum ... böyle bir sorun diğer dillerde bir baş ağrısıdır. so simple
Hady Elsahar

18
@Elchin: kullanabilirsinizmetrics.sort_by{ |k, v| v }.reverse.to_h
Marc-André Lafortune

4
Aslında daha basit: hash.sort_by (&: last) ve bir Hash'e karşı bir dizi çift elde etme konusunda aynı uyarı.
Gerry Gleason


14

Zaten cevap verdim ama yine de. Kodunuzu şu şekilde değiştirin:

metrics.sort {|a1,a2| a2[1].to_i <=> a1[1].to_i }

Yol boyunca dizgilere dönüştürülüp dönüştürülmezse, bu işi yapar.


9

Gördüğüm davranış bu değil:

irb(main):001:0> metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" =>
 10 }
=> {"siteb.com"=>9, "sitec.com"=>10, "sitea.com"=>745}
irb(main):002:0> metrics.sort {|a1,a2| a2[1]<=>a1[1]}
=> [["sitea.com", 745], ["sitec.com", 10], ["siteb.com", 9]]

Hat boyunca bir yerde sayılarınızın dizgeye dönüştürülmesi mümkün müdür? Göndermediğiniz başka kod var mı?


Ahh sağ, kodumdaki sonucun bir dize olarak döndürüldüğü gibi görünüyor. Bozuk veri türleri. :) Bazen soruna çok yakınım. Teşekkürler.
Dustin

1
Evet. Bazen birinin Ruby'ye "türsüz" olarak bahsettiğini duyuyorum. Oh, hayır, kesinlikle yazılmış. Sadece statik olarak yazılmamış. :)
Jacob Mattison
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.