2016-01-15 18 views
9

Dizileri bir ints ve dizeleri karışımıyla sıralamaya çalışıyorum. Örneğin alın:Bir dizi dizi ve dizge nasıl sıralanır?

a = ["a", "b", 5, "c", 4, "d", "a1", "a12", 3, 13, 2, "13a", "12a"] 

Denedim:

a.sort do |x, y| 
    if x.class == y.class 
    x <=> y 
    else 
    x.class.to_s <=> y.class.to_s 
    end 
end 

döndürür Hangi:

[2, 3, 4, 5, 13, "12a", "13a", "a", "a1", "a12", "b", "c", "d"] 

istediğim sonuçtur:

[2, 3, 4, 5, "12a", 13, "13a", "a", "a1", "a12", "b", "c", "d"] 
+0

Dizelerinizde birden fazla numara bulunabilir, örneğin ' "A1b2c3"'? – Stefan

+0

Sorun nedir? [[a1], "a12", "a2"] veya "[" a1 "," a2 "," a12 "]'? – Stefan

+0

@Stefan Dizgideki birden fazla numaraya sahip olabilir. İkincisi, [[a1], "a2", "a12"] ' –

cevap

11
a.sort_by { |x| [(x.to_s.match(/^\d+/) ? x.to_i : 1.0/0), x.to_s] } 

Fikir, önce sayısal değer ve ikinci olarak dize değerine göre sıralamaktır. Dize sayısal değerle başlamıyorsa, sayısal değerin sonsuz olmasını kuvvetle düşünün.


DÜZENLEME: Sadece bu kez OP diye lider sayısal değeri değil, sadece dikkate istediğini açıkladı, ancak takip ettiğini hepsi, aynı fikri kullanabilirsiniz biz her bireyin üzerine uygulamak zorunda dizedeki sayısal ve sayısal olmayan varlık:

a.sort_by do |x| 
    x.to_s.split(/(\D+)/).map do |y| 
    [(y.match(/\d/) ? y.to_i : 1.0/0), y] 
    end 
end 
+1

Dizideki A '0 '," 13a "ve" a "' – Stefan

+0

@Stefan arasında güncelleştirilir. – ndn

+0

Bu daha iyidir, ancak ["a13", "a2"] 'yi düzgün şekilde değil. – Stefan