我試圖理清一個Ruby陣列具有以下功能如何升序排序紅寶石陣,但保持零去年
@prices = @item.prices.sort { |x,y| x.total <=> y.total }
從最低到最高成本的訂單。然而有些產品總共有0.00,我希望它們最後出現而不是頂部。
我已經嘗試了一些東西,但想要一些方法來修改此塊在底部排序零,但其餘按升序排列。
謝謝。
我試圖理清一個Ruby陣列具有以下功能如何升序排序紅寶石陣,但保持零去年
@prices = @item.prices.sort { |x,y| x.total <=> y.total }
從最低到最高成本的訂單。然而有些產品總共有0.00,我希望它們最後出現而不是頂部。
我已經嘗試了一些東西,但想要一些方法來修改此塊在底部排序零,但其餘按升序排列。
謝謝。
所以,制定一個比較要做到這一點......
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}
快樂編碼。
嘗試了這一點,我覺得還是做你要求什麼:
@prices = @item.prices.sort {|a,b| a.total==0 ? 1 : b.total==0 ? -1 : a.total<=>b.total}
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塊生成數組可讓您以乾淨的方式確定主要排序順序,次要排序順序等。
只是爲了記錄:
>> 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]
這會感覺不那麼哈克少寫 - 只限於我:
prices = prices.sort_by do |price|
zero_status = price.zero? ? 1 : 0
[zero_status, price]
end
beca使用它是一種按照兩種標準對事物進行排序的慣用方法,這就是您在這裏所做的。
所以,我想你想說 prices.sort_by {| price | [price.zero ?, price]} – 2013-11-20 23:07:40
@aclarke你不能比較'false'和'true',你的代碼會導致'ArgumentError:Array與Array的比較失敗' – 2013-11-21 02:08:00
我看你是對的 - 這很討厭!Ruby不是很自由地對這件事感到惱火...... C'est la vie!很高興我檢查了我的消息,我可能會實際上試圖在那一天使用。乾杯 – 2014-01-20 05:52:20
謝謝,我很接近。 – 2011-03-25 06:43:53
如果你喜歡條件運算符和一個絕望的班輪'foo.sort {| x,y | x.total.zero? ? 1:x.total <=> y.total}' – rubyprince 2011-03-25 08:49:57
這個答案是錯誤的。問題是它只檢查'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