2012-11-04 23 views
6

Olası Çoğalt:
Sorting an array in descending order in RubyYakut sıralama dizi

ben ters sırada haricinde bazı koşulu temel elemanlardan oluşan bir dizi sıralamak istiyorum. Yani temelde ne yaparsa yapsın ve sonra tersine dönün.

Yani örneğin ben bir dize dizisi var ve bu işi yapar iken dize uzunluğunu

a = ["test", "test2", "s"] 
a.sort_by!{|str| str.length}.reverse! 

azaltarak bunu sıralamak istiyorum ... sıralama böyle bir durumun belirtmek için bir yol var algoritma tersine yapacak mı? Kolayca sonra engellenmez şey üzerinde tasnif ediyorsanız

a.sort_by! { |s| -s.length } 

Eğer sort! kullanmak ve el karşılaştırma tersine çevirebilir: basitçe sırasını tersine çevirmek için onu etkisiz hale böylece

cevap

21

uzunluğu bir sayıdır .

# shortest to longest 
a.sort! { |a,b| a.length <=> b.length } 

ancak sıralamayı tersine çevirmek için sırasını takas olabilir: Örneğin, normalde bunu yapacağını

# longest to shortest 
a.sort! { |a,b| b.length <=> a.length } 
+0

Oh, bu iyi bir numara! – MxyL

+1

+1 benden daha hızlı yazmak için: P – Thilo

+1

Performans bilge daha iyi (ve bana sorarsanız daha anlamlıdır): 'a.sort_by (&: uzunluk) .reverse' – Mosselman

6
@mu gelen cevap çok kısa

harika ama sadece çalışır sayılar. Genel durum için, sort yöntemine başvurabilirsiniz:

irb> a = ["foo", "foobar", "test"] 
    => ["foo", "foobar", "test"] 
irb> a.sort{|a,b| a.length <=> b.length} 
=> ["foo", "test", "foobar"] 
irb> a.sort{|a,b| b.length <=> a.length} 
=> ["foobar", "test", "foo"] 
+0

Meh, daha hızlı yazıyor ... :) – Thilo

+4

'sort_by (&: uzunluk) .reverse 'daha okunabilir ve daha hızlı olacaktır. –

+0

Katılıyorum ama bu soru değildi. – Thilo