다음 코드가 있습니다.
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"]