2011-10-09 16 views
3

私はRubyで配列の配列を持っている:Rubyで配列の配列から必要な値を見つける真の方法は何ですか?

price_list = [ 
    ['Brand-1', 'Model-1', 100.00], 
    ['Brand-1', 'Model-2', 200.00], 
    ['Brand-2', 'Model-1', 10.00], 
    ['Brand-2', 'Model-2', 20.00], 
    ['Brand-1', 'Model-1', 110.00], 
    ['Brand-1', 'Model-2', 190.00], 
    ['Brand-1', 'Model-3', 300.00], 
    ... 
    ['Brand-n', 'Model-n', 1234.00] 
] 

そして、私は唯一のユニークな製品と最小限の価格で新しい配列を作成する必要があります。このようなもの:

new_price_list = [ 
    ['Brand-1', 'Model-1', 100.00], 
    ['Brand-2', 'Model-1', 10.00], 
    ['Brand-2', 'Model-2', 20.00], 
    ['Brand-1', 'Model-2', 190.00], 
    ['Brand-1', 'Model-3', 300.00], 
    ... 
    ['Brand-n', 'Model-n', 1234.00] 
] 

Rubyでこれを行うには、最も高速で最も美しい方法は何ですか?

答えて

5

グループ化されたキーで(ブランド+モデル)レイ:

prices = [ 
    ['Brand-1', 'Model-1', 100.00], 
    ['Brand-1', 'Model-2', 200.00], 
    ['Brand-2', 'Model-1', 10.00], 
    ['Brand-2', 'Model-2', 20.00], 
    ['Brand-1', 'Model-1', 110.00], 
    ['Brand-1', 'Model-2', 190.00], 
    ['Brand-1', 'Model-3', 300.00], 
] 

grouped = prices.group_by { |brand, model, price| [brand, model] } 
grouped.values.map { |grouped_prices| grouped_prices.min_by(&:last) } 

出力:

[["Brand-1", "Model-2", 190.0], 
["Brand-1", "Model-3", 300.0], 
["Brand-2", "Model-1", 10.0], 
["Brand-2", "Model-2", 20.0], 
["Brand-1", "Model-1", 100.0]] 
+0

この素晴らしい、ありがとう! –

1
items = Hash.new() 
price_list.each{|brand,model,price| 
    item=items[brand+model] 
    items[brand+model]=[brand,model,price] if (!item||item[2]>price) 
} 
+0

それが正常に動作しています。ありがとうございました! –

+0

私はそれよりも短く、より美しいコードを作ることが可能だと思います。 –

0

に係る二組に固有のすべての要素を持つ新しい配列を返す必要がありnew_price_list = price_list & Array.new(price_list)を用いapi docs

セットなしで、 二つの配列に共通の要素を含む新しい配列を交差が、戻り値なし重複します。

+0

彼の問題の2番目の配列は、望ましい結果です。 – bricker

+0

ah missread、編集したコードサンプル –

1

あなたはブランドやモデルによってソートする必要がいけない場合は、これは次のように行うことができます。

new_price_list = price_list.sort_by { |brand,model,price| price }.uniq {|brand, model, price| [brand, model] } 

あなたは、それはまた、並べ替えたい場合は、もう一度

new_price_list = price_list.sort_by { |brand,model,price| brand + model }.sort_by { |brand,model,price| price }.uniq {|brand, model, price| [brand, model] } 

ソートする必要があり編集:ブロック付きuniqはrubyでのみ動作します1.9

関連する問題