2012-07-23 96 views
0

我試圖對給定的價格和產品進行排序時遇到了一些問題。Ruby對多個值進行排序

arr = [[6,"iPhone"],[4,"Android"],[5,"iPhone"],[3,"Xbox"], 
     [9,"Android"],[8,"Xbox"]] 

但我需要按產品,然後按價格排序。我做下一公用做到這一點:

arr.sort_by! {|x| [x[1],x[0]]}.reverse 
=> [[6, "iPhone"], [5, "iPhone"], [8, "Xbox"], [3, "Xbox"], 
    [9, "Android"], [4, "Android"]] 

但我需要再次給它的產品現在塊排序,第一等得到最昂貴的一塊。我正在尋找它的結果:

arr = [[9,"Android"],[4,"Android"],[8,"Xbox"],[3,"Xbox"], 
     [6,"iPhone"],[5,"iPhone"]] 

任何幫助將不勝感激!

更新1 我已經測試Dave的答案,它的事業,但在其他組項目,我沒有得到正確排序的產品塊。

arr = [[6.0,"iPad 2"], [7, "Mints"], [6.0, "Nerf Crossbow"], [4.5, "iPad 2"], 
[6, "Mints"], [6.75, "Nerf Crossbow"], [6.0, "iPad 2"], [5, " Mints"], 
[9.0, "Nerf Crossbow"]] 

我得到了這樣的結果:

1.9.2p320 :5 > arr.sort! { |a, b| (a[1] <=> b[1]).nonzero? || b[0] <=> a[0] } 
=> [[7, "Mints"], [6, " Mints"], [5, "Mints"], [9.0, "Nerf Crossbow"], 
[6.75, "Nerf Crossbow"], [6.0, "Nerf Crossbow"], [6.0, "iPad 2"], [6.0, "iPad 2"], 
[4.5, "iPad 2"]] 

的問題是,我期待

[[9.0, "Nerf Crossbow"], [6.75, "Nerf Crossbow"], [6.0, "Nerf Crossbow"], 
[7, "Mints"], [6, "Mints"], [5, "Mints"],[6.0, "iPad 2"], [6.0, "iPad 2"], 
[4.5, "iPad 2"]] 

回答

4

操作簡單,只需否定價格:

arr.sort_by! {|price, product| [product.downcase, -price]} 

這是更清晰並比使用更快。我將downcase添加到產品名稱中,因爲您可能不應該關注該案例。

+0

它給出了一個完全不同的結果,但是。 – 2012-07-23 00:35:58

+0

這是更好的;) – 2012-07-23 00:37:34

+0

@DaveNewton:Oups,沒有注意到我需要扭轉元素的順序。固定。 – 2012-07-23 00:37:47

3

這裏的另一種選擇:

arr.sort_by { |e| [e[1], -e[0]] }