2010-03-31 2 views
2

나는이 두 배열 :연결하여 배열 항목

x = [ ["0", "#0"], ["1", "#1"] ] 
y = [ ["00", "00 description"], ["10", "10 description"] ] 

내가 뭘해야 할 것은 병합하는 것입니다 그래서 난 결과로 다음 얻을 : 그 방법

result = [ ["000", "#0 00 description"], ["010", "#0 10 description"], 
    ["100", "#1 00 description"], ["110", "#1 10 description"] ] 

있습니까? 아니면 collect 또는 이와 비슷한 것을 사용해야합니까?

미리 감사드립니다.

+0

정확히 무엇을 의미합니까 '? 이것들은 문자열이어야합니까? –

+0

예, 문자열입니다. 그 죄송합니다. –

답변

1

당신은 Array#product 방법을 사용할 수 있습니다

x = [ ['0', "#0"], ['1', "#1"] ] 
#=> [["0", "#0"], ["1", "#1"]] 
y = [ ['00', "00 description"], ['10', "10 description"] ] 
#=> [["00", "00 description"], ["10", "10 description"]] 
x.product(y).map{|a1,a2| [a1[0]+a2[0], a1[1] + ' ' + a2[1]]} 
#=> [["000", "#0 00 description"], ["010", "#0 10 description"], ["100", "#1 00 description"], ["110", "#1 10 description"]] 

을 그리고 당신은 (사이의 공간에 삽입되는 두 번째) 이상 연결의 다른 종류를 필요로하지 않는다면,도 변이가없는 Array#product의 변종은 허용 가능하게 덜 읽을 수 있습니다.

x.inject([]){|a,xe| 
    a + y.map{|ye| 
    xe.zip(ye).map{|e| 
     e.inject(&:+) 
    } 
    } 
} 
+0

거의 동일합니다! –

+0

완벽 고맙습니다! –

+1

@ 글렌 : 예 ... :) 나는 원래의 버전에 따르면,'join'을 생각하지 않았지만, 다시 한번, 나는 문자열뿐만 아니라 마음 속에 숫자를 가지고있었습니다. –

2

예에서 정수의 특정 십진수 표현의 숫자를 연결하는 특별한 규칙을 적용하는 것처럼 보입니다.이 규칙은 간단한 방법으로는 작동하지 않습니다 (예 : 00을 작성하는 경우 통역사에게만 0). 그러나 단순한 문자열 연결을 가정하는 것은 당신이 무엇을 의미하는지입니다 :

x = [ ["0", "#0"], ["1", "#1"] ] 
y = [ ["00", "00 description"], ["10", "10 description"] ] 
z = [] 
x.each do |a| 
    y.each do |b| 
    c = [] 
    a.each_index { |i| c[i] = a[i] + b[i] } 
    z << c 
    end 
end 
p z 

편집 : 질문의 원래 게시 된 버전은 각 하위 배열의 첫 번째 요소로 정수를 가지고, 솔루션의 서문은을 의미합니다. 이후 질문은 문자열이 여기에 가정 된대로 편집되었습니다. A의 여기

x.product(y).map{|a1,a2| 
    a1.zip(a2).map{|e| 
    e.inject(&:+) 
    } 
} 

을 그리고 :

+0

물론 'a.each_index' 루프를 애플리케이션과 관련이있는 것으로 대체 할 수 있습니다. 'c [0] = a [0] * 100 + b [0]'. – Arkku

+0

+1. 예, 문자열 연결 일 수 있습니다. 하지만 난 그걸 할 수있는 더 예쁜 방법을 찾고 있었어. 그리고 이것은 꽤 보이지 않아. 어쨌든. –

+0

야. 이것은 7 라인 솔루션입니다. 한 개의 라이너를 찾더라도이 제품만큼 깨끗하고 이해할 수있을 것입니다. 왜 "꽤"있어야만 하는가? 그것은 당신의 스크린에 맞고 일을합니다. 그것은 모두 중요합니다. – ryeguy

1

예제에서 공백없이 첫 번째 요소를 연결하지만 두 번째 요소는 공백으로 연결합니다. 같은 방법으로 모두를 할 수 있다면, 이것은 단지가 될 수 있습니다 다른 회씩 연결이 필요한 경우

x.product(y).map {|a,b| a.zip(b).map(&:join)} 
=> [["000", "#000 description"], ["010", "#010 description"], ["100", "#100 description"], ["110", "#110 description"]] 

는,이 할 수 있습니다 :

x.product(y).map {|a,b| [a[0]+b[0],a[1]+' '+b[1]]} 
=> [["000", "#0 00 description"], ["010", "#0 10 description"], ["100", "#1 00 description"], ["110", "#1 10 description"]] 
당신이`000을 말할 때
+0

Ruby 설치를 업데이트 할 때가 된 것 같습니다. 내 제품에는 없어. =) – Arkku

+0

@Arkku 1.9로 업그레이드 할 수 없다면'product'가 1.8.7로 역전되었음을 알게되어 기쁩니다. 그리고 1.8.7로 업그레이드 할 수 없다면, "백 포트"보석은 가지고 있어야합니다. –

관련 문제