0

与えられた価格と製品を分類しようとすると、少し問題が発生しました。

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"]] 

しかし、最も高価な1つのブロックを最初に取得するために、製品のブロックで並べ替える必要があります。私が探している結果は次のとおりです。

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

どんな助けでもありがたいです!

アップデート1 デイブの答えとその作品をテストしましたが、他の一連のアイテムでは、正しい種類の製品ブロックを取得できませんでした。

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

2 に答える 2

4

シンプルで、価格を否定するだけです。

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

これは、を使用するよりも明確で高速ですsortdowncaseおそらくケースを気にする必要がないので、製品名に追加しました。

于 2012-07-23T00:34:09.353 に答える
3

別のオプションは次のとおりです。

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

于 2012-07-23T00:36:18.617 に答える