2011-03-25 65 views
2

我試圖理清一個Ruby陣列具有以下功能如何升序排序紅寶石陣,但保持零去年

@prices = @item.prices.sort { |x,y| x.total <=> y.total } 

從最低到最高成本的訂單。然而有些產品總共有0.00,我希望它們最後出現而不是頂部。

我已經嘗試了一些東西,但想要一些方法來修改此塊在底部排序零,但其餘按升序排列。

謝謝。

回答

1

所以,制定一個比較要做到這一點......

if x.total == 0 
    # always consider 0 "largest" and no 0 can be larger than another 
    # (make sure 0.0 is 0 and not a number really close to 0) 
    # perhaps x or y should be first for other reasons as well? 
    1 
else 
    # otherwise lower to higher as normal 
    x.total <=> y.total 
end 

或者沒有註釋:

foo.sort {|x, y| if x.total == 0 then 1 else x.total <=> y.total end} 

快樂編碼。

+0

謝謝,我很接近。 – 2011-03-25 06:43:53

+1

如果你喜歡條件運算符和一個絕望的班輪'foo.sort {| x,y | x.total.zero? ? 1:x.total <=> y.total}' – rubyprince 2011-03-25 08:49:57

+2

這個答案是錯誤的。問題是它只檢查'x.total == 0',但它也應該檢查'y.total == 0'並且在這種情況下也返回1。否則,對於某些數組,您不會得到所需的結果,例如:'[2,1,0] .sort {| x,y |如果x == 0,那麼1 else x <=> y end}'給出'[0,1,2]'。 (注意,爲了簡單起見,我跳過了'.total'部分,但問題是一樣的。) – antinome 2015-09-15 20:59:40

3

嘗試了這一點,我覺得還是做你要求什麼:

@prices = @item.prices.sort {|a,b| a.total==0 ? 1 : b.total==0 ? -1 : a.total<=>b.total} 
2
prices = [0, 1, 2, 0,4, 3] 
prices = prices.sort_by do |price| 
    [ 
    if price == 0 
     1 
    else 
     0 
    end, 
    price 
    ] 
end 
p prices 
# => [1, 2, 3, 4, 0, 0] 

的這裏訣竅是,陣列通過比較它們的第一元素相比,但如果這些元素是相等的,那麼通過比較它們的下一個元素,依此類推。因此,使用sort_by塊生成數組可讓您以乾淨的方式確定主要排序順序,次要排序順序等。

2

只是爲了記錄:

>> a = [0, 1, 3, 0, 2, 5, 0, 9] 
=> [0, 1, 3, 0, 2, 5, 0, 9] 
>> a.sort_by { |x| x.zero? ? Float::MAX : x } 
=> [1, 2, 3, 5, 9, 0, 0, 0] 

在大多數平臺1.0/0將評估爲Infinity,所以你也可以用這個來代替Float::MAX

>> b = [1,4,2,0,5,0] 
=> [1, 4, 2, 0, 5, 0] 
>> Inf = 1.0/0 
=> Infinity 
>> b.sort_by { |x| x.zero? ? Inf : x } 
=> [1, 2, 4, 5, 0, 0] 
0

這會感覺不那麼哈克少寫 - 只限於我:

prices = prices.sort_by do |price| 
    zero_status = price.zero? ? 1 : 0 
    [zero_status, price] 
end 

beca使用它是一種按照兩種標準對事物進行排序的慣用方法,這就是您在這裏所做的。

+0

所以,我想你想說 prices.sort_by {| price | [price.zero ?, price]} – 2013-11-20 23:07:40

+0

@aclarke你不能比較'false'和'true',你的代碼會導致'ArgumentError:Array與Array的比較失敗' – 2013-11-21 02:08:00

+1

我看你是對的 - 這很討厭!Ruby不是很自由地對這件事感到惱火...... C'est la vie!很高興我檢查了我的消息,我可能會實際上試圖在那一天使用。乾杯 – 2014-01-20 05:52:20