在Ruby中按布尔值对对象排序

时间:2009-05-24 14:27:33

标签: ruby-on-rails ruby sorting boolean enumerable

我很抱歉,如果之前已经回答过或者很明显......在这里和Goog上做了一些搜索并找不到答案。

我希望按价格对一系列提供商进行排序,以及它们是否是preferred_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

有关更好地解决此问题的方法的任何建议吗?

2 个答案:

答案 0 :(得分:8)

大多数语言提供的排序函数接受comparators这类事情。在Ruby中,这只是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
       }

答案 1 :(得分: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

(请注意,我没有测试过这段代码,因此可能会出现一些错误,但我认为这可以证明这个想法。)