[ruby] Ruby에서 두 배열 병합 및 인터리브

다음 코드가 있습니다.

a = ["Cat", "Dog", "Mouse"]
s = ["and", "&"]

나 에게 줄 배열 s에 배열 을 병합하고 a싶습니다.

["Cat", "and", "Dog", "&", "Mouse"]

Ruby Array 및 Enumerable 문서를 살펴보면이 작업을 수행 할 방법이 보이지 않습니다.

각 배열을 반복하지 않고이 작업을 수행 할 수있는 방법이 있습니까?



답변

다음과 같이 할 수 있습니다.

a.zip(s).flatten.compact


답변

이것은 Chris가 요청한 순서대로 결과 배열을 제공하지 않지만 결과 배열의 순서가 중요하지 않으면 a |= b. mutate를 원하지 않는 경우 결과를 작성하고 변수에 할당 a할 수 있습니다 a | b.

http://www.ruby-doc.org/core/classes/Array.html#M000275 에서 Array 클래스에 대한 집합 통합 문서를 참조하십시오 .

이 답변은 중복 배열 요소를 원하지 않는다고 가정합니다. 최종 배열에서 중복 요소를 허용 a += b하려면 트릭을 수행해야합니다. 다시 말하지만, 당신이 돌연변이하지 않으려는 경우 a, 사용 a + b및 변수에 결과를 할당합니다.

이 페이지의 일부 의견에 대한 응답으로이 두 솔루션은 모든 크기의 배열에서 작동합니다.


답변

중복을 원하지 않는 경우 통합 연산자를 사용하십시오 .

new_array = a | s


답변

s.inject(a, :<<)

s   #=> ["and", "&"]
a   #=> ["Cat", "Dog", "Mouse", "and", "&"]

요청한 순서를 제공하지는 않지만 하나에 추가하여 두 배열을 병합하는 좋은 방법입니다.


답변

다음은 크기가 다른 여러 배열을 인터리빙 할 수있는 솔루션입니다 (일반 솔루션).

arr = [["Cat", "Dog", "Mouse", "boo", "zoo"],
 ["and", "&"],
 ["hello", "there", "you"]]

first, *rest = *arr; first.zip(*rest).flatten.compact
=> ["Cat", "and", "hello", "Dog", "&", "there", "Mouse", "you", "boo", "zoo"]


답변

우아하지는 않지만 모든 크기의 배열에서 작동합니다.

>> a.map.with_index { |x, i| [x, i == a.size - 2 ? s.last : s.first] }.flatten[0..-2]
#=> ["Cat", "and", "Dog", "&", "Mouse"]


답변

첫 번째 배열이 가장 길지 않고 여러 배열을 허용하더라도 작동하는보다 일반적인 솔루션은 어떻습니까?

a = [
    ["and", "&"],
    ["Cat", "Dog", "Mouse"]
]

b = a.max_by(&:length)
a -= [b]
b.zip(*a).flatten.compact

 => ["Cat", "and", "Dog", "&", "Mouse"]