2009-12-14 2 views
0

(키가 아닌) 해시 값이 일치하는 경우에만 :채우기 루비하는 array1 array2는 문자열 요소와 경우와 배열 2 요소는 내가 루비 해시가

VALS = { :one => "One", :two => "Two" } 

및 배열 :

array2 = ["hello", "world", "One"] 

질문 : 어떻게 VALI의 값과 정확히 일치하는 array2의 모든 값만 가져 오도록 새 array1을 채울 수 있습니까?

는 예를 들어, 나는 시도했다 : 다른 것은, 및 없음 작업과 함께

array2.each_with_index do |e,i| 
array1 << e if VALS[i] ~= e 
end 

합니다. 멍청한 놈.

감사


화려한! 하지만 시도해 봤는데 :

p array.select { |i| hash.has_value? i ? array[i+1] : "foo"} 

나는 fixnum 오류를 변환 할 수 없습니다있어. 나는 뭔가를 놓치고 있어야합니다.

답변

6

두 집합이 큰 경우 중첩 루프를 사용하면 속도가 매우 느려집니다. 이 세트로 내용을 치료하는 것이 좋습니다 :

array1 = VALS.values & array2 
print array1 

출력 :

hash = { :one => "One", :two => "Two" } 
array = ["hello", "world", "One"] 

p array.select { |i| hash.has_value? i } 
# >> ["One"] 
+0

& 연산자가 배열의 교차 집합으로 작동한다는 것을 알지 못했습니다. 매일 새로운 것을 배우십시오 :) +1 –

+0

흠 ... 필요없이 작동합니다 '설정'도 .. 결코 생각하지 못했을 것입니다! 하지만 i 번째 요소와 일치하는 배열의 i + 1 번째 요소를 가져 오려면 어떻게해야합니까? – Eric

0

가 여기에 옵션들 중 하나입니다!

array.select do |i| 
    if VALS.has_value? i 
    result << array[array.index(i)+1] 
    end 
end 
+0

감사합니다! 각 경기에서 i + 1 값을 어떻게 선택합니까? – Eric

+0

배열 구성원을 나타내는 블록 매개 변수로 'i'를 사용하지 않는 것이 좋습니다. 색인 번호를 나타내는 데만 사용합니다. –

0

이있어 :

One