두 배열을 한 번에 반복하는 '루비 방식'이란 무엇입니까


127

해결해야 할 문제보다 구문 호기심이 더 많습니다 ...

길이가 같은 두 개의 배열이 있으며 두 인덱스를 한 번에 반복하여 두 인덱스를 모두 특정 인덱스에 출력하려고합니다.

@budget = [ 100, 150, 25, 105 ]
@actual = [ 120, 100, 50, 100 ]

다음 each_index과 같이 배열을 사용 하고 색인을 생성 할 수 있음을 알고 있습니다 .

@budget.each_index do |i|
  puts @budget[i]
  puts @actual[i]
end

거기에 루비 방법 이 작업을 수행하는 더 나은? 뭔가 같은 이?

# Obviously doesn't achieve what I want it to - but is there something like this?
[@budget, @actual].each do |budget, actual|
  puts budget
  puts actual
end

1
크기가 같은 배열입니까?
Anurag

1
--둘 다 같은 길이로 알려진
nfm

답변:


276
>> @budget = [ 100, 150, 25, 105 ]
=> [100, 150, 25, 105]
>> @actual = [ 120, 100, 50, 100 ]
=> [120, 100, 50, 100]

>> @budget.zip @actual
=> [[100, 120], [150, 100], [25, 50], [105, 100]]

>> @budget.zip(@actual).each do |budget, actual|
?>   puts budget
>>   puts actual
>> end
100
120
150
100
25
50
105
100
=> [[100, 120], [150, 100], [25, 50], [105, 100]]

12
'.each'는 배열 요소를 펼칠 수 있습니까? 나도 몰라 얼마나 더 루비 I의 궁금 : /
니키타 리박

5
그런 식을 사용하려는 경우를 대비하여 항상 메서드 호출에 괄호를 사용하는 것이 가장 좋습니다. @ budget.zip (@actual) .each
AboutRuby

1
@AboutRuby :이 경우 필요합니다! 결정된.
Marc-André Lafortune

2
이런 루비 라인을 볼 때 나는 손을 공중에 던지고 챔프처럼 방을 뛰어 다닌다!
iGbanam

9
이 규모입니까? 2 개의 10000 개의 항목 배열이있는 경우 20,000 개의 항목 배열이 필요합니까? 문서는 이것을 제안합니다.
Tom Andersen


20

열거자를 사용하여 한 번에 두 개의 배열을 반복하는 다른 방법이 있습니다.

2.1.2 :003 > enum = [1,2,4].each
 => #<Enumerator: [1, 2, 4]:each> 
2.1.2 :004 > enum2 = [5,6,7].each
 => #<Enumerator: [5, 6, 7]:each> 
2.1.2 :005 > loop do
2.1.2 :006 >     a1,a2=enum.next,enum2.next
2.1.2 :007?>   puts "array 1 #{a1} array 2 #{a2}"
2.1.2 :008?>   end
array 1 1 array 2 5
array 1 2 array 2 6
array 1 4 array 2 7

열거자는 다른 기술 중에서도 무한 직렬 병렬 반복을 허용하기 때문에 위에서 사용한 예보다 더 강력합니다.


1
loop위 의 그림 에서 색인을 얻는 방법이 있습니까?
Biju

16

뿐만 아니라 a.zip(b).each{|x,y| }다른 사람이 말했듯이, 당신은 또한 말할 수있는 [a,b].transpose.each{|x,y| }작은 조금 더 대칭 나를 파업한다. 여분의 [a,b]배열을 생성하므로 빠르지는 않을 것 입니다.


11
+1 좋은 점 중 하나는 transpose두 배열의 길이가 같지 않으면 예외가 발생한다는 것 입니다.
Andrew Grimm

14

원래의 질문과 관련 하여 값이 순환되도록 할 길이 가 다른 배열을 반복하는 경우 사용할 수 있습니다.

[1,2,3,4,5,6].zip([7,8,9].cycle)

루비가 줄 것이다

[[1, 7], [2, 8], [3, 9], [4, 7], [5, 8], [6, 9]]

이렇게하면 nilzip을 사용하여 얻을 수 있는 가치에서 벗어날 수 있습니다.


6

배열을 다루는 경우 두 배열을 함께 압축하면 잘 작동합니다. 그러나 다음과 같은 끝없는 열거자를 다루는 경우 어떻게됩니까?

enum1 = (1..5).cycle
enum2 = (10..12).cycle

enum1.zip(enum2)zip모든 요소를 ​​평가하고 결합하려고하기 때문에 실패 합니다. 대신 다음을 수행하십시오.

enum1.lazy.zip(enum2)

하나는 lazy게으른가-평가 결과 열거함으로써 당신을 절약 할 수 있습니다.


2

#each_with_index를 사용하여 타협하고 어떻습니까?

include Enumerable 

@budget = [ 100, 150, 25, 105 ]
@actual = [ 120, 100, 50, 100 ]

@budget.each_with_index { |val, i| puts val; puts @actual[i] }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.