2015-01-19 3 views
1

의 배열에서 고유 한 특성을 수집 :보다 효율적인 방법은 데이터 구조를 주어진 배열

users.map do |uid, attributes| 
    attributes[:country_code] 
end.uniq 

:

[ 
    [ 
    "1", 
    { 
     :user_uid=>"1", 
     :display_name=>"joe", 
     :country_code=>"ITA", 
     # more attributes 
    } 
    ], 
    # more users 
] 

나는이 같은 모든 country_code 속성의 고유 목록을 얻을 수 있습니다 하지만 매우 큰 데이터 세트를 가지고 있다면, 모든 사용자를 통해 여전히 반복됩니다 (물론 Ajedi32가 지적했듯이 물론 그렇습니다).

이 데이터를 수집하는 효율적인 방법이 있습니까?

+3

당신이 블록'uniq'를 사용할 수 있지만, 아마 당신은 이미 O (n)이 – ave

+3

의 것을 얻을 수있는 최선의 방법 당신은 말했다 "이 여전히 루프 모든 사용자를 통해 "반복하여 모든 사용자를 반복하지 않고이를 수행 할 수있는 방법이 있다고 생각한다는 의미입니다. 특정 사용자가 새롭고 고유 한 국가 코드를 포함 할 수 있다고 가정 할 때 모든 사용자의 국가 코드를 확인하지 않고이를 수행 할 수 있다고 생각합니까? – Ajedi32

+0

사실입니다. 감사합니다. 저의 잘못된 이해를 제쳐두고이 데이터를 수집하는보다 효율적인 방법을 찾고 싶습니다. – dax

답변

1

사용자가 1 명인 경우 각 방법을 500 번 실행하는 데 걸리는 시간을 비교할 때 uniq보다 빠름을 발견했습니다. 너를 도울 수있어.

begin 
    array = [] 

    users.each do |_, attributes| 
    array |= [attributes[:country_code]] 
    # http://www.ruby-doc.org/core-2.2.0/Array.html#method-i-7C 
    end 

    array 
end 
+0

@ Зелёный 그건 ['Array # |'] (http://www.ruby-doc.org/core-2.2.0/Array.html#method-i-7C) – Stefan

+0

내 잘못입니다. 고마워요 @ 스탄 –

1

내가 제안 :

require 'set` 

users.each_with_object(Set.new) { |(_, attributes),s| 
    s << attributes[:country_code] }.to_a 
관련 문제