3

如果之前已经回答过或者很明显,我深表歉意......在这里和 Goog 上进行了一些搜索,但找不到答案。

我正在寻找按价格对提供者数组进行排序,以及它们是否是首选提供者?(对或错)

例如在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]

国际妇女联合会

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

不起作用并得到...

undefined method `<=>' for false:FalseClass

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

4

2 回答 2

8

大多数语言都提供了接受比较器的排序函数。在 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
       }
于 2009-05-24T15:03:07.707 回答
3

<=>您可以在类上定义 aProvider来执行您想要的操作,然后使用该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.

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

于 2009-05-24T15:03:06.240 回答