2009-05-24 7 views
3

이전에 답변이되었거나 분명한 경우 사과드립니다. 여기에서 Goog에서 검색하고 답변을 찾지 못했습니다.Ruby에서 부울 값으로 객체 정렬

나는 공급자의 배열을 가격별로 정렬하고 선호하는 공급자인지 여부를 찾고 있습니까? (true 또는 false)

array p of Providers의 예를 들어

...

는 는
p1.price == 1, p1.preferred_provider? == false 
p2.price == 2, p2.preferred_provider? == true 
p2.price == 3, p3.preferred_provider? == true 
는 내가 p.sort_by과 좀하고 싶습니다

:

p.sort_by {|x| x.preferred_provider?, x.price } 

[p2 p3 p1] 

의거하지 않습니다 일하고 도착하면 ...

undefined method `<=>' for false:FalseClass 

이 문제에 접근하는 더 좋은 방법에 대한 제안 사항이 있으십니까?

+0

실제로, 당신은 거의 그것을 가지고 있습니다 : p.sort_by {| x | [x.preferred_provider? ? 0 : 1, x.price]}. –

+0

아 ... 좋은. 리팩토링 후보. 감사. –

답변

7

대부분의 언어는 이런 종류의에 대한 comparators을 받아 정렬 기능을 제공 맡은 일. 루비에서 이것은 단지 array.sort입니다 :

p.sort {|a, b| if (a.preferred_provider? == b.preferred_provider? 
       then a.price <=> b.price 
       elsif a.preferred_provider? 
        1 
       else -1 
     } 
+0

이 논리는 올바른 순서를 반환하지 않지만 a.preferred_provider를 사용하여 올바른 경로에 놓았습니까? == b.preferred_provider? 1과 -1을 뒤집는다. 감사합니다. –

+1

물론, 거기에 ==를 사용하고 싶습니다 (지금 수정 됨). 비트를 정교화하기 위해 클로저는 a가 b 다음에 오는 경우에는 양수를, b가 b 앞에 오는 경우 음수를, 정렬 용으로 같으면 0을 반환해야합니다. 그렇게하면 숫자 값을 정렬하기 쉽도록 구현할 수 있습니다. {| a, b | a - b}. –

3

Provider 클래스에 <=>을 정의한 다음 원하는대로 수행 한 다음 Array.sort 메서드를 사용하여 정렬 할 수 있습니다 (Enumerable.sort_by 대신). 여기에 내가 채찍질 <=>의 정의는 다음과 같습니다

class Provider 
    def <=>(other) 
    if preferred_provider? 
     if other.preferred_provider? 
     @price <=> other.price 
     else 
     1 
     end 
    else 
     if other.preferred_provider? 
     -1 
     else 
     @price <=> other.price 
     end 
    end 
    end 
end 

를 그리고, 당신이 당신의 배열 p이있는 경우, 당신은 단지 p_sorted = p.sort을 할 수 있습니다.

(I이 코드를 테스트하지 않습니다, 그래서 약간의 오차가있을 수 있습니다,하지만 난이 아이디어를 설명하는 역할을 생각합니다.)

+0

이것은 원래의 질문에 언급하지 않은 이유로 다른 솔루션이 내 문제에 더 적합했습니다. 고마워 ... 많이 감사 하네. –