2011-10-09 3 views
3

나는 루비에서 배열의 배열을 가지고 :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

키 (브랜드 + 모델)로 그룹화 한 다음 그룹화 된 ar 광선 :

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

그의 질문에 두 번째 배열이 원하는 결과입니다. – 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 블록이 루비에서만 작동합니다. 1.9

관련 문제