2013-03-14 28 views
10

İki özelliği değerlendirerek, bir nesne dizisini yakut içinde sıralamak için özel bir blok yöntemi belirtmek istiyorum. Ancak, google'daki birçok aramadan sonra, < => operatörü olmadan herhangi bir örneğe ulaşmadım. b vs bir karşılaştırma: ruby ​​özel sıralama yöntemi

Bu

yapmak istediğim budur ... Bu benim kodu (yakut, üzgün de çaylak) 'dir

if a.x less than b.x return -1 
if a.x greater than b.x return 1 
if a.x equals b.x, then compare by another property , like a.y vs b.y 

ve işe doesnt

ar.sort! do |a,b| 
    if a.x < b.y return -1 
    elseif a.x > b.x return 1 
    else return a.y <=> b.y 
end 

Bu blok, fonksiyonun geri dönüşü ve -1'den geri dönmesi için bir fonksiyon içerisindedir. Bu konuda herhangi bir yardım için minnettar olacağım.

Saygılarımızla. case deyimi ile

+0

Neden sıralama yöntemini kullanmıyorsunuz? –

+0

@Gashner Kullanıyorum, ancak değerlendirmeyi kişiselleştirmeyi amaçlıyorum. – alexserver

+0

Neden <=> 'dışarı hükmediyor? Çünkü bunu zor yoldan yapmak ister misin? –

cevap

13

:

ar.sort do |a, b| 
    case 
    when a.x < b.x 
    -1 
    when a.x > b.x 
    1 
    else 
    a.y <=> b.y 
    end 
end 

üçlü olarak:

ar.sort { |a,b| a.x < b.x ? -1 : (a.x > b.x ? 1 : (a.y <=> b.y)) } 
+0

Teşekkürler, bu işe yaradı! – alexserver

+5

Yakılabilirlik/bakım nedeniyle yakutta çok düzeyli üçlü bir ifade kullanılmaz. "Sort_by" ve "Array # <=>" için –

23

Bu y sonra x için küçükten büyüğe verecektir:

points.sort_by{ |p| [p.x, p.y] } 
+0

+1, tam anlamıyla OP arzularına sahiptir. – dbenhur

+0

Bu, _very_ zarif! Aferin - kabul edilen cevap olmalı, IMHO – Sebastian

0

Bu iş gibi görünüyor:

# Ascending 
ar.sort! do |a,b| 
    (a-b).abs() > 0 ? a-b : 0 
end 

# Descending 
ar.sort! do |a,b| 
    (a-b).abs() > 0 ? b-a : 0 
end 

Orada uzay operatörü (<=>) gerek var - Yakut gerçek olamayacak kadar 0 gördüğü, çünkü (sözdizimi verimliliği açısından) Ruby gereksiz gibi görünüyor ve özellikle (yukarıda) bu kullanım için, sadece koyabilirsiniz Üçlü operatördeki açık 0.