Ruby自定义排序返回-1 + 1而不是数组

时间:2014-01-19 13:06:59

标签: ruby-on-rails ruby arrays sorting

我正在尝试实现我的第一个ruby排序算法。该算法基于一些特定的规则(“总是喜欢xy类型的对象,类型yyy的对象”),如果没有触发这些规则,它使用ruby< => -operator。我是在ruby-on-rails一对多协会上做的。

问题是这个algortihm没有返回数组本身,它只返回-1或1,比较的结果。但实际上我不明白为什么,因为我的结果只在sort-block中返回

这是我目前的代码:

def sort_products!
  products.sort! do |p1, p2|
    result = 0

    # Scalable Products are always the last ones in order
    if p1.class.name == "ScalableProduct"
      result = -1
    elsif p2.class.name == "ScalableProduct"
      result = 1
    end

    if result == 0
      # Put products producing electricity and heating down
      if p1.can_deliver_electricity?
        result = -1
      elsif p2.can_deliver_electricity? 
        result = 1
      end
    end

    # Else: Just compare names
    result = p1.name <=> p2.name if result == 0
    result
  end
end

2 个答案:

答案 0 :(得分:0)

在我看来,这里的最佳做法是在<=>模型中实施Product。您需要包含Comparable模型才能实现此目的:

class Product
  include Comparable

  def <=>(another_product)
    # Compare self with another_product
    # Return -1, 0, or 1
  end
end

然后您的排序方法将简化为:

def sort_products!
  products.sort!
end

答案 1 :(得分:0)

将括号的do..end更改为块的分隔符。它首先进行排序,然后在结果上使用块(因为precedence of the do..end syntax)。使用括号,它使用块作为排序块,这是你想要的。

此外,在您的比较中,如果您的产品都是ScalableProduct,那么您不会以合理的方式订购它们。如果它们同时为ScalableProduct,您可能希望将result保留为0,以便按照名称进行比较。同样处理can_deliver_electricity?