루비

2012-03-21 2 views
1

에 해시의 배열을 정렬 나는 같이 해시의 배열을 가지고있다.루비

이제 seqno와 그 다음 이름으로 정렬하고 싶습니다. seqno는 nil 일 수 있습니다 (seqno가 nil이면 seqno가있는 구의 뒤에 와야합니다).

wardList.sort! do |a,b| 
    return (a[:name] <=> b[:name]) if (a[:seqno].nil? && b[:seqno].nil?) 
    return -1 if a[:seqno].nil? 
    return 1 if b[:seqno].nil? 
    (a[:seqno] <=> b[:seqno]).nonzero? || 
    (a[:name] <=> b[:name]) 
end 

그러나 이것은 나에게 오류 제공합니다 :

내가 지금까지 가지고 것은 는 정수

답변

2

첫째, 는 데이터, 당신은 여기에 문자열로 정수 작동하지 않을 수 있습니다 정상화

wardList.sort_by! { |x| [x[:seqno] || Float::INFINITY, x[:name]] } 

예 :

irb(main):034:0> a = [{:seqno=>5, :name=>"xsd"}, 
         {:seqno=>nil, :name=>"foo"}, 
         {:seqno=>nil, :name=>"bar"}, 
         {:seqno=>1, :name=>"meh"}] 
irb(main):033:0> a.sort_by { |x| [x[:seqno] || Float::INFINITY, x[:name]] } 
=> [{:seqno=>1, :name=>"meh"}, 
    {:seqno=>5, :name=>"xsd"}, 
    {:seqno=>nil, :name=>"bar"}, 
    {:seqno=>nil, :name=>"foo"}] 
+0

예,하지만 [: seqno]가 nil 인 경우 어떻게해야합니까? –

+0

nil에서 정수로 암시 적으로 변환하지 못했습니다. –

+0

@Lieven : 수정 사항을 확인하십시오. –

1

에 기호를 변환 할 수 없습니다이 작동합니다 :

sorted = wardList.sort_by{|a| [a[:seqno] ? 0 : 1, a[:seqno], a[:name]] } 

또는 일부 루비 (예 : 1.8.7) :

sorted = wardList.sort_by{|a| [a[:seqno] ? 0 : 1, a[:seqno] || 0, a[:name]] } 
그런 다음 사전 식 정렬을 지원 sort_by를 사용할 수 있습니다

wardList = wardList.map { |x| x.merge({:id => x[:id].to_i, 
             :seqno => x[:seqno].try(:to_i) }) } 

:

+0

네,하지만 SEQNO가 같거나 둘 전무 경우 그것은 또한 이름을 정렬 할 필요가있다 .. –

+0

수정되었으므로 필요한 내용을 포함해야합니다. – PinnyM

+0

어떻게 작동하는지 설명해 주시겠습니까? –

0

나는를 사용해야한다고 생각하지 않습니다. 여기서은 블록을 반복자로 반환하고 반복기는 둘러싼 메서드로 돌아가고 둘러싸는 메서드는 호출자에게 반환합니다. 만 (이 경우 sort!) 반복자로 돌아갑니다 블록을 일으키는 대신 next를 사용하여 같은 작업을 수행합니다

wardList.sort! do |x,y| 
    next 1 if x[:seqno].nil? 
    next -1 if y[:seqno].nil? 
    comp = x[:seqno] <=> y[:seqno] 
    comp.zero? ? x[:name] <=> y[:name] : comp 
end 
+0

이것은'x [: seqno] .nil? &&! y [: seqno] .nil? ' –

+0

은 저에게 효과적입니다 ... 최소한의 예를 들려 줄 수 있습니까? –