문제

이것이 전에 답변되었거나 명백하다면 나의 사과는 ... 여기와 Goog에서 검색을했고 답을 찾을 수 없었습니다.

나는 가격과 가격으로 제공자를 정렬하고 선호하는 _provider인지 여부를 정렬하고 싶습니까? (참 또는 거짓)

예를 들어 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를하고 싶습니다.

[p2 p3 p1]

iaw

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

작동하지 않고 얻는다 ...

undefined method `<=>' for false:FalseClass

이 문제에 접근하는 더 나은 방법에 대한 제안이 있습니까?

도움이 되었습니까?

해결책

대부분의 언어는 받아들이는 정렬 기능을 제공합니다 비교기 이런 종류의 일을 위해. 루비에서는 이것이 바로 배열입니다.

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

다른 팁

당신은 a를 정의 할 수 있습니다 <=>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.

(이 코드를 테스트하지 않았으므로 몇 가지 오류가있을 수 있지만 아이디어를 보여주는 역할을합니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top