2014-01-19 50 views
1

我試圖實現我的第一個紅寶石排序算法。該算法基於一些特定的規則(「總是首選類型爲xxx的對象,而不是類型爲yyy的對象」),如果這些規則都未觸發,則使用ruby < => - 運算符。我在ruby-on-rails一對多關聯中這樣做。Ruby自定義排序返回-1而不是數組

問題是,這algortihm不返回數組本身,它只是返回-1或1,比較的結果..但我實際上不明白爲什麼,因爲我的結果只返回排序 - 塊。

這裏是我當前的代碼:

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 
+0

你可以顯示調用該方法的代碼嗎? –

+0

plz打印出sort_products中的產品數組!方法調用排序之前!方法。 – nickcen

回答

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 
0

更改爲do..end括號作爲塊的分隔符。它是先排序,然後使用結果塊(因爲precedence of the do..end syntax)。使用括號,它使用塊作爲排序塊,這是你想要的。

此外,在您的比較中,如果您的產品都是ScalableProduct,那麼您不會以合理的方式訂購它們。如果他們同時都是ScalableProduct,則可能需要將result保留爲0,這樣才能回到按名稱比較。與can_deliver_electricity?相同。